使用accepts_nested_attributes_for更新属性

时间:2015-04-06 15:14:16

标签: ruby-on-rails ruby-on-rails-4 associations

我有两个型号User和Advert。用户has_many:广告和广告belongs_to:user。我使用accepts_nested_attributes_for来更新广告属性。我就是这样做的:

class Users::RegistrationsController < Devise::RegistrationsController 
   @user = current_user 
   @user.update_attributes(adverts_attributes: [{id: ???, show_advert: false}])
end

要让@user能够更新广告,他需要拥有广告ID。如果我只输入ID广告,例如112这很好用。我也尝试过这种方式:

Advert.all.each do |advert|
  @advert = advert.id
end

仅适用于最旧的广告。

那么如何访问广告ID?

<Advert id: 356, created_at: "2015-04-06 00:54:29", updated_at: "2015-04-06 00:54:29", user_id: 66, show_advert: true> 

<User id: 66, email: "xxx@xxx", encrypted_password: "xxx", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 69, current_sign_in_at: "2015-04-04 22:25:47", last_sign_in_at: "2015-04-04 18:11:27", current_sign_in_ip: #<IPAddr: IPv4:xxx>, last_sign_in_ip: #<IPAddr: IPv4:xxx>, created_at: "2015-03-07 21:32:13", updated_at: "2015-04-05 01:40:29"> 

取消计划表格

<%= form_for(resource, :as => resource_name, :url => users_cancel_plan_path, :html => { id: 'cancel_plan', :method => :put }) do |f| %>
   <%= f.submit "Cancel Subscription", class: "btn btn-danger" %>
<% end %>

1 个答案:

答案 0 :(得分:1)

在模型中,您需要 -

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

您还应该将白名单保持为:

class Users::RegistrationsController < Devise::RegistrationsController
  def user_params
    params.require(:user).permit(:name, .., adverts_attributes: [:id, :addr1, ..])
  end
end

:update_only文档中的小注:

  

对于一对一关联,此选项允许您指定在关联记录已存在时如何使用嵌套属性。通常,现有记录可以使用新的属性值集更新,也可以由包含这些值的全新记录替换。 默认情况下,:update_only选项为false,嵌套属性仅在包含记录的:id值时才用于更新现有记录。否则,将实例化新记录并用于替换现有记录。但是,如果:update_only选项为true,则嵌套属性将始终用于更新记录的属性,无论是否存在:id。 集合关联会忽略该选项。

阅读Nested Forms指南,了解如何使用嵌套表单。