【问题标题】:updating attributes with accepts_nested_attributes_for使用 accept_nested_attributes_for 更新属性
【发布时间】:2015-04-06 15:14:16
【问题描述】:

我有两个模型用户和广告。用户 has_many :adverts 和 Advert 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 %>

【问题讨论】:

  • 检查并在问题中添加您的参数。
  • @architgupta 我添加了参数

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


【解决方案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 指南以了解如何使用嵌套表单。

【讨论】:

  • 就我而言,据我了解,我有一对多,并且在使用嵌套属性时需要具有 :id 值来更新现有记录。
  • 你知道我怎么能得到广告:id?
  • 这取决于您创建表单的方式。您是否阅读过 Rails 指南链接?
  • 你的意思是 f.fields_for :adverts do |builder| ?不,我的表格中没有这个。我还有其他选择吗?
  • 那么你从哪里得到其他属性,那是你试图更新?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-22
  • 2021-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多