2015-06-25 2 views
0

Это моя первая попытка использовать модели с ассоциациями с 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 

приложение само по себе является более сложным, чем это. Я упростил это, чтобы проиллюстрировать проблему.

Заранее благодарим за вашу помощь!

+0

Ваши отправляют параметры ' "человек"' внутри ' "adoption_request"' хэша, но я верю в это следует называть '' person_attributes''. Появляется, что вам может потребоваться изменить название этого поля в вашем представлении, чтобы оно проходило по желанию. Помогает ли это? – DRSE

+0

@DRSE Это имело бы смысл. Но я использую стандартный помощник формы Rails (ну, бутстрап, который создает практически тот же HTML), который я ожидаю «просто работать» до конца, поскольку я использую стандартные соглашения Rails. Я обновил свой вопрос с подробной информацией о том, как создается представление/форма. – lps

+0

Попробуйте изменить '= f.fields_for @ принятие_request.person do | owner_fields |' to '= f.fields_for person do | owner_fields |' – Pavan

ответ

1

Вы должны изменить эту строку

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

в

= f.fields_for :person do |owner_fields| 
0

Я бы просто попытался создать объект Person при сохранении. Перенесите имя и фамилию как скрытые поля.

В противном случае я бы дал strong parameters a прочитал.

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

Я не ставил его в качестве явного требования, но я не хочу сохранять принятие_request, если человек не строит и не сохраняет правильно. Поэтому я думаю, что лучше сохранить все связанные модели сразу. – lps

Смежные вопросы