传递参数以更新嵌套属性

时间:2011-11-09 00:09:43

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

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

#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

2 个答案:

答案 0 :(得分:6)

您将错误的params散列传递给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散列中的ID,控制器和操作值来自url的路由值。

E.g。

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

答案 1 :(得分:-2)

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

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

拉出我要编辑的报价单。然后:

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

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

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

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

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