【发布时间】: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