2
まで

私はそれが動作するようにしようとしているが、それはdosen't!Rails 3、ネストされた複数レベルのフォームとhas_manyから

私は

class User < ActiveRecord::Base 
    has_many :events, :through => :event_users 
    has_many :event_users 
    accepts_nested_attributes_for :event_users 
end 

class Event < ActiveRecord::Base 
    has_many :event_users 
    has_many :users, :through => :event_users 
    accepts_nested_attributes_for :users 
end 

class EventUser < ActiveRecord::Base 
    set_table_name :events_users 
    belongs_to :event 
    belongs_to :user 
    accepts_nested_attributes_for :events 
    accepts_nested_attributes_for :users 
end 

もテーブルレイアウト

event_users 
    user_id 
    event_id 
    user_type 
events 
    id 
    name 
users 
    id 
    name 

を持っており、これが私のフォームです

<%= semantic_form_for @event do |f| %> 
    <%= f.semantic_fields_for :users, f.object.users do |f1| %> 
    <%= f1.text_field :name, "Name" %> 
    <%= f1.semantic_fields_for :event_users do |f2| %> 
     <%= f2.hidden_field :user_type, :value => 'participating' %> 
    <% end %> 
    <% end %> 
<%= link_to_add_association 'add task', f, :users %> 
<% end %> 

問題は、私は、新しいユーザーをこのように作成した場合user_typeの値は設定しません(ただし、user_idとevent_idを持つuserとevent_usersが作成されます)。ユーザーの作成と送信後に編集フォームに戻った場合、user_typeの値はevents_usersに設定されます。 (私もformtasticなしで試した) 何か提案はありますか?ありがとう!

----編集----

私はまた、ユーザー

<%= semantic_form_for @event do |f| %> 
    <%= f.semantic_fields_for :event_users do |f1| %> 
    <%= f1.hidden_field :user_type, :value => 'participating' %> 
    <%= f1.semantic_fields_for :users do |f2| %> 
     <%= f2.text_field :name, "Name" %> 
    <% end %> 
    <% end %> 
<%= link_to_add_association 'add task', f, :event_users %> 
<% end %> 

前event_usersを持つようにしようとしたが、その後、それは私だけのエラーがスローされます。

User(#2366531740) expected, got ActiveSupport::HashWithIndifferentAccess(#2164210940)

--edit--

link_to_associationはformtastic-cocoonメソッドです(https://github.com/nathanvda/formtast)。 IC-繭)が、私は他のアプローチを行うことを試みたが、同じ結果と

---編集----

def create 
    @event = Event.new(params[:event]) 
    respond_to do |format| 
    if @event.save 
     format.html { redirect_to(@event, :notice => 'Event was successfully created.') } 
     format.xml { render :xml => @event, :status => :created, :location => @event } 
    else 
     format.html { render :action => "new" } 
     format.xml { render :xml => @event.errors, :status => :unprocessable_entity }     
    end 
    end 
end 
+0

コントローラ作成アクションを表示できますか? – Nerian

+0

が追加されました! – jonepatr

答えて

2

正直言って、このように編集したり、has_many :throughを作成しようとしたことはありません。

少し時間がかかり、formtastic_cocoonの内部でjsを修正する必要があったので、ここではうまくいきます。

EventUserモデルを指定し、Userモデルを入力する必要があります(もう一方の方法ではうまくいかない)。あなたが書いモデル内部だから、

class Event < ActiveRecord::Base 
    has_many :event_users 
    has_many :users, :through => :event_users 
    accepts_nested_attributes_for :users, :reject_if => proc {|attributes| attributes[:name].blank? }, :allow_destroy => true 
    accepts_nested_attributes_for :event_users, :reject_if => proc {|attributes| attributes[:user_attributes][:name].blank? }, :allow_destroy => true 
end 

class EventUser < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :event 
    accepts_nested_attributes_for :user 
end 

class User < ActiveRecord::Base 
    has_many :events, :through => :event_users 
    has_many :event_users 
end 

その後景色。(ここでは魔法の少しが来る)あなたが部分部分_event_user_fields.html.hamlを指定する必要があります、そして、events/_form.html.haml

= semantic_form_for @event do |f| 
    - f.inputs do 
    = f.input :name 

    %h3 Users (with user-type) 
    #users_with_usertype 
     = f.semantic_fields_for :event_users do |event_user| 
     = render 'event_user_fields', :f => event_user 
     .links 
     = link_to_add_association 'add user with usertype', f, :event_users 

    .actions 
     = f.submit 'Save' 

(私は今のエラーを無視) で開始:

.nested-fields 
    = f.inputs do 
    = f.input :user_type, :as => :hidden, :value => 'participating' 
    - if f.object.new_record? 
     - f.object.build_user 
    = f.fields_for(:user, f.object.user, :child_index => "new_user") do |builder| 
     = render("user_fields", :f => builder, :dynamic => true) 

と終わりに_user_fields部分(実際に部分的である必要はありません)

.nested-fields 
    = f.inputs do 
    = f.input :name 

これは動作するはずです。 formtastic_cocoon gemを更新しなければならなかったので、バージョン0.0.2に更新する必要があります。

ここで、user_typeを簡単なドロップダウンから、隠しフィールドの代わりに簡単に選択することができます。これは、常に実際にEventUserの必要性を排除し、その場で新しいユーザーを作成します

  • = f.input :user_type, :as => :select, :collection => ["Participator", "Organizer", "Sponsor"] 
    

    いくつかの考えを(今私はそれが動作証明)を使用します。既存のユーザーをドロップダウンから選択することも許可しますか?

  • 個人的に私はそれを回します:ユーザーが自分自身をイベントに割り当てることができます!
+0

うわー!私はあなたが実際にこれを解決したとは信じられない!あなたは私のヒーローです!どうもありがとうございます!!主催者がすべての参加者を追加する背後にある理由は、イベント中に発生した経済関連の問題を解決するために、実際のイベントの後にイベントが追加されることです。はい、私は既存のユーザーを追加しています!再度、感謝します!! – jonepatr

+0

マルチドロップダウンから選択したユーザ(既存のユーザ)にuser_typeを追加する方法はありますか? – jonepatr

+0

'_event_user_fields'部分で、私は自動的に新しいユーザーを作成します。これを行う代わりに、新しいユーザーを追加するには1つ、ドロップダウンから既存のユーザーを追加するには1つのリンクが2つあります。それは十分明確ですか? – nathanvda

0

events_usersモデルは、ID列を持っていませんか?追加のフィールド(user_type)があるため、EventUserはモデルであり、おそらくIDを持つ必要があります。おそらく、あなたの最初のケースでuser_typeが設定されていないのかもしれません。

+0

私はIDを追加しようとしていましたが、それは何の違いもありません:/ – jonepatr

+0

奇妙なことは、それが更新時に設定されているが、作成時には設定されていないということです! – jonepatr

関連する問題