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

执行此操作时,您需要使用嵌套表单结构来同时更新两个模型。您需要将Accepts_nested_attributes_for添加到您的 Event 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

活动模型很好,因为您已经拥有 belongs_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 列,该列将标识与其对应的活动,并用于 Rails 进行关联。

现在,对于听起来您需要的 many_to_many 关联,您有两个选择。您可以使用 has_many through 或 HABTM。最简单的经验法则是,如果您认为需要将关系模型作为独立实体使用,则应该设置一个 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 回答