首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >传递参数以更新嵌套属性

传递参数以更新嵌套属性
EN

Stack Overflow用户
提问于 2011-11-09 08:09:43
回答 2查看 12.9K关注 0票数 3

我正在开发一个非常基本的实践应用程序,其中用户可以创建多个报价。我遇到的问题是我不能更新我的报价。我有很多东西,我已经在这里和谷歌上阅读了其他问题,但找不到我做错了什么。下面是我的代码:

代码语言:javascript
复制
#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

报价控制器

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-09 09:59:32

您正在将错误的参数哈希传递到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的路由值。

例如。

代码语言:javascript
复制
params[] = 
{ 
      :controller => 'quotations',
      :action => 'edit',
      :id => '1',
      :quotation => 
      {
          :quote_text=> "Blah", 
          :author=> "Steve", 
          :quote_type=> "1", 
          :user_id=> "6"
      }
}
票数 6
EN

Stack Overflow用户

发布于 2011-11-10 10:03:20

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

代码语言:javascript
复制
@quotation = @user.quotations.find(params[:id]) 

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

代码语言:javascript
复制
if @quotation.update_attributes(params[:id])

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

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

代码语言:javascript
复制
if @quotation.update_attributes(params[:quotation]) 

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

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8058835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档