我有一个活动和活动。每个事件都有一个活动,用户需要从大量活动中挑选。我有一个在事件表单中正确显示的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>
我的无知在哪里?
答案 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
你可以随意调用关系,“计划”就是我想到的。