无法将belongs_to模型保存为has_one表单的一部分

时间:2012-09-08 19:55:15

标签: ruby-on-rails activerecord

我有一个活动和活动。每个事件都有一个活动,用户需要从大量活动中挑选。我有一个在事件表单中正确显示的collection_select字段,但它不会保存。我一直收到Couldn't find Activity without an ID错误。

我认为通过在模型中创建has_one belongs_to关联,表单会自动知道该怎么做。不。所以我开始向Events控制器添加方法,甚至不知道它们是否正确。但事情没有破裂。

现在我想我可能需要在表单中创建一个局部变量,但是我已经尝试了十几种变体并且无法获得任何工作。我最终得到了其他错误消息。

我的活动模特

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>
  

我的无知在哪里?

1 个答案:

答案 0 :(得分: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

活动模型很好bc你已经拥有了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 on nested model表单

回答评论中的问题......是的,我会反过来你的模型关系设置,所以你有......

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 guide以获取有关这些关联将创建的所有方法的更多说明和详细信息。

我总是喜欢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 

你可以随意调用关系,“计划”就是我想到的。