嵌套表单:更新子外键

时间:2014-12-21 14:31:55

标签: ruby-on-rails ruby-on-rails-4 activerecord nested-forms nested-attributes

我有一个嵌套关联:

class User < ActiveRecord::Base
  has_many :hostels
  accepts_nested_attributes_for :hostels
end

class Hostel < ActiveRecord::Base
  belongs_to :user
end

表格:

<%= form_for @user do |f| %>
<%= f.label :email %><br>
<%= f.text_field :email %>
<% f.object.hostels << @hostel -%>
<%= f.fields_for :hostels do |ff| %>
<%= ff.hidden_field :id %>
<% end -%>
<%= f.submit %>
<% end -%>

控制器

def create
  @user = User.new(user_params)
  raise @user.hostels.inspect
end

private
def user_params
  params.require(:user).permit(:email, hostels_attributes: [:id])
end

我想通过更新宿舍外键将现有的宿舍记录重新链接到新用户。这样,它肯定不起作用。

尝试嵌套update_only: true参数。

关于这个主题的任何想法,或者我是否完全错误地尝试这样的操作?

1 个答案:

答案 0 :(得分:0)

你可以在你的表格中使用多项选择,然后在控制器中你必须要求hostel_ids。

型号:

class User < ActiveRecord::Base
  has_many :hostels
end

class Hostel < ActiveRecord::Base
  belongs_to :user
end

表单:其中:name是您在多个选择中看到的内容

<%= form_for @user do |f| %>
 <%= f.label :email %><br>
 <%= f.text_field :email %>
 <%= f.label "Hostels" %><br>
 <%= select_tag :hotel_ids, options_for_select(Hostel.all.map{|h| [h.name, h.id]}), { :multiple => true } %>
 <%= f.submit %>
<% end %>

控制器:

def create
  @user = User.new(user_params)
end

private
def user_params
  params.require(:user).permit(:email, hostel_ids)
end

我没有测试代码但必须运行良好。