【问题标题】:Additional Attributes Appearing in Rails Request ParamsRails 请求参数中出现的附加属性
【发布时间】:2012-11-29 13:38:30
【问题描述】:

我在我的 rails 应用程序中看到了一些功能,通过这些功能,我传递给 rails 的参数被封装在控制器中的请求和参数之间的某个位置。

以前没关系,但我最近遇到了一个问题,因此决定尝试找出它发生的原因。我没有运气,希望这里有人能指出我正确的方向。

我的客户端请求负载如下所示:

{
    "id"=>"1",
    "email" => "peter.hamilton10@imperial.ac.uk",
    "first_name" => "Peter",
    "last_name" => "Hamilton",
    "year" => 3,
    "private_attr" => "something"
}

在 Rails 中,日志显示了这一点

Started PUT "/students/1" for 127.0.0.1 at 2012-11-29 13:20:56 +0000
Processing by StudentsController#update as JSON
  Parameters: {"id"=>"1",
               "email" => "peter.hamilton10@imperial.ac.uk",
               "first_name" => "Peter",
               "last_name" => "Hamilton",
               "year" => 3,
               "private_attr" => "something",
               "student" => {
                   "email"=>"peter.hamilton10@imperial.ac.uk",
                   "first_name"=>"Peter",
                   "last_name" => "Hamilton",
                   "year"=>3
               }
              }

student 属性来自哪里,它的字段是如何生成的?

我知道不能批量分配的属性不会出现(上面由private_attr 说明)所以我假设它为当前控制器的模型提取字段,但否则我有点不知所措......

更新:模型

# Schema
# create_table "students" do |t|
#   t.string   "email"
#   t.string   "first_name"
#   t.string   "last_name"
#   t.integer   "year"
#   t.integer   "private_attr"
# end
class Student < ActiveRecord::Base
  attr_accessible :email, :first_name, :last_name, :year
end

(注意:我不希望 private_attr 通过,我只是将其作为测试并认为它可能有用)

请求实际上并非来自表单,而是来自手动生成的 ajax 请求。

【问题讨论】:

  • 您能提供您的型号代码吗?
  • 也许在您看来,您正在使用form_for :studentfields_for :student,然后使用表单对象作为例如f.text_field :email(以及"student" =&gt; 下的其他字段),但对于另一个(不在“学生”下),您使用的是text_field 没有表单对象?
  • 你也可以发布你的表单视图吗?
  • @PeterHamilton,你能展示一下 ajax 请求是如何构建的吗?
  • 我认为由于请求以students/1 结尾,并且它似乎是一个更新(?)Rails 这样做可能是为了帮助你(修复带有学生属性的子哈希)。通常,当您在例如更新。但是,这只是一个猜测。也许控制器中的某些参数导致了这个......

标签: ruby-on-rails ruby ruby-on-rails-3 httprequest


【解决方案1】:

查看包装参数:

http://edgeapi.rubyonrails.org/classes/ActionController/ParamsWrapper.html

我不知道您是否使用 Rails 4,但这是最新版本的幕后情况。

【讨论】:

    【解决方案2】:

    在控制器中添加以下代码:

    wrap_parameters :model,包括:Model.column_names + [:attr]

    Model - 你的模型,:attr - 附加属性

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-15
      • 2019-09-03
      • 2022-10-06
      • 2016-04-26
      相关资源
      最近更新 更多