【问题标题】:Rails 4, Strong Parameters, Unpermitted parameters on fields belonging to associated modelRails 4,强参数,属于关联模型的字段上的未经允许的参数
【发布时间】:2015-06-25 20:08:00
【问题描述】:

这是我第一次尝试使用与 Rails 4 关联的模型,但由于“未经许可的参数”错误,我无法获取 POST 中的参数。我尝试了几种不同的方法来允许关联的字段,但没有成功。

基本上,我有一个相关人员的收养请求。

class AdoptionRequest < ActiveRecord::Base
  has_one :person

  accepts_nested_attributes_for :person
end

class Person < ActiveRecord::Base
    belongs_to :adoption_request
end

以下是adoptions_requests_controller.rb 中的相关部分:

def create
    @adoption_request = AdoptionRequest.new(adoption_request_params)

    respond_to do |format|
        if @adoption_request.save
            format.html { redirect_to @adoption_request, notice: 'Adoption request was successfully created.' }
            format.json { render action: 'show', status: :created, location: @adoption_request }
        else
            format.html { render action: 'new' }
            format.json { render json: @adoption_request.errors, status: :unprocessable_entity }
        end
    end
end

private
    def adoption_request_params
        params.require(:adoption_request).permit(person_attributes: [:first_name, :last_name])
    end

视图中的表单是使用 rails-bootstrap-forms 生成的:

= bootstrap_form_for @adoption_request do |f|
    = f.fields_for @adoption_request.person do |owner_fields|
        = owner_fields.text_field :first_name
        = owner_fields.text_field :last_name
    = f.submit

这是一个由此为名字字段生成的 HTML 示例:

 <input class="form-control" id="adoption_request_person_first_name" name="adoption_request[person][first_name]" type="text">

现在当我提交以下 POST 有效负载时:

{"utf8"=>"✓", "authenticity_token"=>"kE1Q222VzXRsuLnhiO0X3mijW1TGTWSAOVgVDz/rxsE=", "adoption_request"=>{"person"=>{"first_name"=>"John", "last_name"=>"Smith"}}, "commit"=>"Create Adoption request"}

已创建收养请求,但未创建相关人员。这似乎正在发生,因为强参数不允许人员参数通过。举个例子,我在 rails 控制台输出中看到了这一点:

Unpermitted parameters: person

根据strong parameters documentation,这个配置应该可以工作,但我也尝试过:

params.require(:adoption_request).permit(:person, person_attributes: [:first_name, :last_name])

这会导致相同的错误(“Unpermitted parameters: person”),并且

params.require(:adoption_request).permit!

允许参数通过,但这不是一个可接受的解决方案,因为它否定了使用强参数的全部目的。

我做错了什么?

这是我的 Gemfile,如果有帮助的话:

source 'https://rubygems.org'

ruby '2.0.0'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.0.3'

# Use postgresql as the database for Active Record
gem 'pg'

# Use SCSS for stylesheets
gem 'sass-rails', '~> 4.0.0'

# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'

# Use CoffeeScript for .js.coffee assets and views
gem 'coffee-rails', '~> 4.0.0'

# Use jquery as the JavaScript library
gem 'jquery-rails'

# Turbolinks makes following links in your web application faster. Read more:     https://github.com/rails/turbolinks
gem 'turbolinks'

# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 1.2'

group :doc do
    # bundle exec rake doc:rails generates the API under doc/api.
    gem 'sdoc', require: false
end

# Use Bootstrap
gem 'bootstrap-sass', '~> 3.3.4'

# Use Figaro to make using environment variables easier
gem 'figaro'

# Use Slim templating engine
gem "slim-rails"

# User authlogic for authentication system
gem 'authlogic'

# Use rails-bootstrap-forms to integrate rails form builder with bootstrap
gem 'bootstrap_form'

group :test do
    # use MiniTest::Spec::DSL
    gem 'minitest-spec-rails', '~> 4.7'
end

应用程序本身比这更复杂。我已对其进行了简化以说明问题。

提前感谢您的帮助!

【问题讨论】:

  • 您在"adoption_request" 哈希中发​​送参数"person",但我认为它应该命名为"person_attributes"。看来您可能需要更改此字段在您的视图中的命名方式,以便它按需要通过。这有帮助吗?
  • @DRSE 这是有道理的。但是我使用了标准的 Rails 表单助手(以及引导程序,它产生几乎相同的 HTML),因为我使用的是标准的 Rails 约定,所以我希望它能够端到端地“正常工作”。我更新了我的问题,详细说明了视图/表单的生成方式。
  • 尝试将= f.fields_for @adoption_request.person do |owner_fields|更改为= f.fields_for person do |owner_fields|
  • @Pavan,是的,这就是问题所在。我其实也只是想通了。我在视图中使用以下代码在 HTML 表单中生成正确的输入名称,以便它们使用强参数自动工作,如文档所示:= f.fields_for :person do |owner_fields|。请注意,型号名称必须是符号。使用您的示例会导致语法错误。不过,您确实指出了问题所在。如果您使用正确的代码将您的评论作为答案,我将接受它作为解决方案。谢谢!
  • 那是一个错字。我将其发布为答案:)

标签: ruby ruby-on-rails-4 strong-parameters


【解决方案1】:

你需要改变这一行

= f.fields_for @adoption_request.person do |owner_fields| 

= f.fields_for :person do |owner_fields|

【讨论】:

    【解决方案2】:

    我会简单地尝试在保存时构建 Person 对象。将名字和姓氏作为隐藏字段传递。

    否则我会阅读strong parameters

    if @adoption_request.save
    @adoption_request.persons.build(first_name: @first_name, last_name: @last_name)
    

    【讨论】:

    • 我没有把它作为一个明确的要求,但是如果这个人没有正确构建和保存,我不想保存adoptation_request。所以我认为最好一次保存所有关联的模型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多