【问题标题】:Passing parameters to update nested attributes传递参数以更新嵌套属性
【发布时间】:2011-11-09 00:09:43
【问题描述】:

我正在开发一个非常基本的练习应用程序,用户可以在其中创建多个引用。我遇到的问题是我无法更新我的报价。我有很多东西,并在这里和谷歌上阅读了其他问题,但无法弄清楚我做错了什么。这是我的代码:

#User Model
    class User < ActiveRecord::Base
      has_many :quotations, :dependent => :destroy
      attr_accessible :quotations
      accepts_nested_attributes_for :quotations, :allow_destroy => true
    end

#Quotations Model
class Quotation < ActiveRecord::Base
  attr_accessible :quote_text, :author, :quote_type, :category, :tags, :user_id
  belongs_to :user
end

报价控制器

class QuotationsController < ApplicationController
  before_filter :get_user

  def get_user
    @user = User.find(params[:user_id])
  end 

  def edit
    @quotation = @user.quotations.find(params[:id])
  end

  def update
    @quotation = @user.quotations.find(params[:id]) 
    if @quotation.update_attributes(params[:id])
      redirect_to user_quotation_path :notice  => "Successfully updated quotation."
    else
      render :action => 'edit'
    end
  end    

end

【问题讨论】:

  • 已解决 if @quotation.update_attributes(params[:id]) 只是更新 id,这意味着没有任何改变,因为 id 不在编辑表单上。正确的代码将传递 params[:quotation] 来更新 qoutation 参数。 if @quotation.update_attributes(params[:quotation])

标签: ruby-on-rails parameters parameter-passing nested-attributes


【解决方案1】:

您将错误的参数哈希传递给 update_attributes 调用。应该是

if @quotation.update_attributes(params[:quotation]).

澄清一下,传递:id:quotation 并没有做任何特别的事情。 Symbols in Ruby are just immutable string。所以使用:id:quotation 相当于传递一个字符串“id”或“quotation”。 params[] 是您页面发布的所有表单参数的哈希图。

在 params 哈希中,有一个您要传递的类型的键(在本例中为 quotation),它的值是另一个哈希值,其中包含与您视图中的报价相关的所有已发布字段以及那些字段。

params hash 中的 ID、controller 和 action 值来自 url 中的路由值。

例如

params[] = 
{ 
      :controller => 'quotations',
      :action => 'edit',
      :id => '1',
      :quotation => 
      {
          :quote_text=> "Blah", 
          :author=> "Steve", 
          :quote_type=> "1", 
          :user_id=> "6"
      }
}

【讨论】:

    【解决方案2】:

    好的,我认识的一位出色的 Rails 开发人员帮助我查明了问题。详细说明我的评论(因为 * 不允许我在创建问题后 12 小时内发布答案):

    @quotation = @user.quotations.find(params[:id]) 
    

    拉出我要编辑的引文。然后:

    if @quotation.update_attributes(params[:id])
    

    仅更新 id,这意味着没有任何变化,因为 id 不在编辑表单上。

    正确的代码会传递 params[:quotation] 来更新 qoutation 参数。

    if @quotation.update_attributes(params[:quotation]) 
    

    仅更新我当前正在编辑的报价单的参数。

    【讨论】:

    • 你的回答并不完全正确,对别人有点误导。 :quotation 不是引用参数的符号,它只是一个字符串。我已经更新了我的答案,让您更好地了解正在发生的事情..
    • 感谢您的澄清。我更新了我的答案以反映您的观点,并将您的答案标记为已接受的答案。感谢您花时间详细说明传递参数的细​​节。这是我所见过的最清楚的解释。很大的帮助!
    • 您上面关于参数传递的解释是正确的,除了 :quotation 是一个符号。不知道我们是不是在说废话。 *.com/questions/6428318/…troubleshooters.com/codecorn/ruby/symbols.htm
    • 对不起,我的解释不是很清楚。是的:引号是一个符号。但是 ruby​​ 中的符号只是一个不可变的字符串。我已经用一个链接更新了我的答案,该链接应该可以让您很好地了解 ruby​​ 中字符串和符号之间的区别。