1

イベントとアクティビティがあります。各イベントには 1 つのアクティビティがあり、ユーザーは多数のアクティビティから選択する必要があります。イベント フォームに正しく表示される collection_select フィールドがありますが、保存されません。エラーが発生し続けCouldn't find Activity without an IDます。

モデルに has_one belongs_to 関連付けを作成することで、フォームが何をすべきかを自動的に認識できるようになると考えました。いいえ。そのため、メソッドが正しいかどうかさえわからないまま、イベント コントローラーにメソッドを追加し始めました。しかし、物事は壊れませんでした。

今、おそらくフォームにローカル変数を作成する必要があると考えていますが、さまざまなバリエーションを試しましたが、何も機能しません。他のエラーメッセージが表示されるだけです。

私のイベントモデル

class Event < ActiveRecord::Base

  attr_accessible :date, :activity

  has_one :activity
  belongs_to :creator, :class_name => "User"
  has_many :attendees, :class_name => "User"
  has_many :comments
end

活動モデル

class Activity < ActiveRecord::Base
  attr_accessible :location, :title, :image, :image_cache

  mount_uploader :image, ImageUploader

  belongs_to :event
end

イベントコントローラーの一部

def new
  @event = Event.new
  @activities = Activity.find(:all, :order => 'title')

end

def create
  @event = Event.new(params[:event])
  @activities = Activity.find(:all, :order => 'title')
  @activity = Activity.find(params[:id])
end

イベントフォーム

<div class="field">
  <h6>When do you want to go?</h6><br />
  <%= f.text_field :date %>
</div>
<h5>Activities</h5>

<%= collection_select(:activity, :event_id, Activity.all, :id, :title, {:include_blank => 'Please Select'} ) %>


<div class="actions">
  <%= f.submit %>
</div>

私の無知はどこにあるのでしょうか?

4

1 に答える 1

2

これを行う場合、両方のモデルを同時に更新するために、ネストされたフォーム構造を使用する必要があります。accept_nested_attributes_forをイベントの model.rb ファイルに追加する必要があります。以下は、各ファイルがどのように見えるかです。

イベントモデル

class Event < ActiveRecord::Base
  attr_accessible :date, :activity

  has_one :activity
  accepts_nested_attributes_for :activity

  belongs_to :creator, :class_name => "User"
  has_many :attendees, :class_name => "User"
  has_many :comments
end

アクティビティ モデルは、beens_to イベントを既に持っている場合に適しています

イベント コントローラ:

def new
  @event = Event.new
  activity = @event.activity.build
end

def create
  @event = Event.new(params[:event])
  if @event.save
    #etc.
  end
end

<%= form_for @event do |f| %>  
     <div class="field">
      <h6>When do you want to go?</h6><br />
      <%= f.text_field :date %>
    </div>

    <h5>Activities</h5>
    <%= f.fields_for :activity do |b| %>
       <!--Add whatever form input you need for your activity.--> 
       <%= b.collection_select :title %>
    <% end %>

    <div class="actions">
      <%= f.submit %>
    </div>
<%end%>

ネストされたモデルフォームのrailscastをチェックアウトするためのウォークスルーが必要な場合

コメントの質問に答えて...はい、モデル関係の設定を逆にしますので...

class Activity < ActiveRecord::Base
  has_many :events
end

class Event < ActiveRecord::Base
  belongs_to :activity
end

このように、各イベントには、対応するアクティビティを識別する activity_id 列があり、レールが関連付けを行うために使用されます。

many_to_many アソシエーションが必要になりそうですが、2 つのオプションがあります。または HABTM を介して has_many を使用できます。最も簡単な経験則は、関係モデルを独立したエンティティーとして扱う必要があると思われる場合は、has_many :through 関係をセットアップする必要があるということです。これらの関連付けが作成するすべてのメソッドの詳細と説明については、 このRails ガイドを確認してください。

私は常に has_many が好きです。なぜなら、将来的に選択した場合に関係を処理するオプションが常にあるからです。その方法は次のとおりです。

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

class Plan < ActiveRecord::Base
  belongs_to :event
  belongs_to :user
end 

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

関係の呼び方は何でも構いませんが、「計画」は私が最初に考えたものです。

于 2012-09-08T22:05:21.350 に答える