Rails 4,强参数,属于关联模型的字段上不允许的参数

Rails 4, Strong Parameters, Unpermitted parameters on fields belonging to associated model

这是我第一次尝试使用与 Rails 4 关联的模型,由于某些原因,由于 [=51],我无法获得输入的参数 POST =] 错误。我尝试以多种不同方式允许关联字段,但均未成功。

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

class AdoptionRequest < ActiveRecord::Base
  has_one :person

  accepts_nested_attributes_for :person
end

class Person < ActiveRecord::Base
    belongs_to :adoption_request
end

以下是来自 adoption_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

根据强参数文档,这个配置应该可以,但我也试过:

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

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

在此先感谢您的帮助!

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

否则我会给strong parameters一个阅读。

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

您需要更改此行

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

= f.fields_for :person do |owner_fields|