Это моя первая попытка использовать модели с ассоциациями с Rails 4, и по какой-то причине я не могу получить параметры POST'ed из-за ошибка «Неперечисленные параметры». Я попытался разрешить связанным полям несколько разных способов без успеха.Rails 4, Strong Parameters, Unpermitted parameters в полях, относящихся к ассоциированной модели
В принципе, у меня есть запрос на усыновление с ассоциированным лицом.
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
Форма, в представлении генерируется с помощью рельсы-бутстраповских-формы:
= 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"}
запрос Принятие создается, но связанный с ним человек не является. Похоже, что это происходит, потому что сильные параметры не позволяют параметрам человека пройти. Дело в точку, я вижу это в выходной Рельсы консоли:
Unpermitted parameters: person
Согласно сильной документации параметров, эта конфигурация должна работать, но я также пытался:
params.require(:adoption_request).permit(:person, person_attributes: [:first_name, :last_name])
, что приводит к тем же ошибка («Самовольная параметры: человек»), и
params.require(:adoption_request).permit!
работает, чтобы параметры через, но это не является приемлемым решением, поскольку это сводит на нет весь смысл USIN g сильные параметры.
Что я делаю неправильно?
Вот мой 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_attributes''. Появляется, что вам может потребоваться изменить название этого поля в вашем представлении, чтобы оно проходило по желанию. Помогает ли это? – DRSE
@DRSE Это имело бы смысл. Но я использую стандартный помощник формы Rails (ну, бутстрап, который создает практически тот же HTML), который я ожидаю «просто работать» до конца, поскольку я использую стандартные соглашения Rails. Я обновил свой вопрос с подробной информацией о том, как создается представление/форма. – lps
Попробуйте изменить '= f.fields_for @ принятие_request.person do | owner_fields |' to '= f.fields_for person do | owner_fields |' – Pavan