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|
这是我第一次尝试使用与 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|