在一个表单中保存belongs_to ID,而不使用隐藏字段?

时间:2011-09-28 10:22:38

标签: ruby-on-rails activerecord

我正在尝试找出保存belongs_to记录ID的最佳方法,同时创建一个新的子记录。我目前正在使用隐藏字段来保留父母的ID。

您能想出更好的方法来完成父母ID的保存(不使用隐藏字段)吗?

这是我的路线片段......

resources :kids
resources :parents do
  resources :kids
end

这是我的父模型......

class Parent < ActiveRecord::Base
  has_many :kids
  accepts_nested_attributes_for :kids
end

这是我的孩子模特......

class Kid < ActiveRecord::Base 
  belongs_to :parent, :autosave => true
end

创建一个新孩子时,这是我的观点形式......

<%= form_for(@kid) do |f| %>
%= f.hidden_field :parent_id, :value => @parent.id %>
<%= f.label :title, 'Title' %>
<%= f.submit %>
<% end %>

然后传递给create(POST)方法......

def create
    @kid = Kid.new(params[:kid])
    @parent = Parent.find(@kid.parent_id)
    @kid.save
    # etc...
end

3 个答案:

答案 0 :(得分:3)

如果您删除路线示例的第一行,只需

resources :parents do
  resources :kids
end

现在你没有在没有父母的情况下调用KidsController的模糊性。您的路线匹配行为类似于

/parents/:parent_id/kids

现在,在您的KidsController中,您可以

def create
  @parent = Parent.find(params[:parent_id])
  @parent.kids.create( params[:kid] )
  #...
end

当你通过has_many集合

创建它时,新的孩子会自动分配它的父级

答案 1 :(得分:1)

是嵌套资源是一种很好的方法,但在您的情况下,您也可以使用“field_for”。

答案 2 :(得分:0)

如果您不想将其作为隐藏字段传递,我建议您使用nested resources,您可以将parent_id保留在网址中,并parents/1/kids作为您的路径。然后,在KidsController中,您需要加载您的父资源并将其与Kid

相关联