Как установить значение для списка has_many в rails 4?

#ruby-on-rails-4 #oauth

#ruby-on-rails-4 #oauth

Вопрос:

У меня есть следующая форма для пользовательской модели, которая имеет множество авторизаций:

 = @user.inspect
= @auth.inspect

= form_for @user, :html => { :multipart => true } do |f|

  - if @user.errors.any?
    #error_explanation
      %h2= "#{pluralize(@user.errors.count, "error")} below."
      %ul
        - @user.errors.full_messages.each do |msg|
          %li.red-text= msg


  .field.ui-field-contain.ui-body
    = f.text_field :full_name, class: "ui-input-text primer corner all ui-shadow-inset", placeholder: "Full name"


  .field.ui-field-contain.ui-body.top-gap
    = f.text_field :email, class: "ui-input-text primer corner all ui-shadow-inset", placeholder: "email@example.com"

  .field.ui-field-contain.ui-body.top-gap
    = f.text_field :username, class: "ui-input-text primer corner all ui-shadow-inset", placeholder: "Username"

  .field.ui-field-contain.ui-body.top-gap
    = f.password_field :password, class: "ui-input-text primer corner all ui-shadow-inset", placeholder: "Password"

  = f.fields_for :authorizations do |a|
    = a.hidden_field :provider
    = a.hidden_field :uid
  

В пользовательском контроллере я устанавливаю значения каждого параметра следующим образом:

   def set_values_for_provider
    auth_hash = request.env['omniauth.auth']

    if params[:provider] == 'facebook'
      @user.full_name = auth_hash.info.name
      @user.email = auth_hash.info.email
      @user.username = auth_hash.info.nickname
    else
      if params[:provider] == 'twitter'
        @user.full_name = auth_hash.info.name
        @user.username = auth_hash.info.nickname
      else 
        if params[:provider] == 'linkedin'
          @user.full_name = auth_hash.info.name
          @user.email = auth_hash.info.email
        end
      end
    end


  @auth = @user.authorizations.build


  @auth.provider = auth_hash.provider
  @auth.uid = auth_hash.uid
end
  

И все же значение hidden_attributes авторизации не устанавливается и не сохраняется. В HTML страницы я получаю следующий вывод:

 <input id="user_authorizations_provider" type="hidden" name="user[authorizations][provider]">
<input id="user_authorizations_uid" type="hidden" name="user[authorizations][uid]">
  

Значение скрытых элементов НЕ задано, хотя при проверке объект auth показывает значения :provider и:uid, возвращаемые gem OAuth. Есть какие-нибудь подсказки, где я ошибаюсь?

ОБНОВЛЕНИЕ: Белый список выглядит следующим образом:

 # Never trust parameters from the scary internet, only allow the white list through.
    def user_params
      params.require(:user).permit(:full_name, :username, :email, :password, :cookie_token, :first_name, :middle_name, :last_name, :designation, :location, :gender, :user_image,:bio, :dob, authorization_attributes: [:provider, :uid])
    end
  

Комментарии:

1. Пожалуйста, опубликуйте strong params метод вашего контроллера.

Ответ №1:

Получена ошибка, которую я допустил в сильных параметрах. _nested_attributes_ должен быть внесен в белый список во множественном числе:

 authorizations_attributes: [:provider, :uid]
  

вместо

 authorization_attributes: [:provider, :uid]
  

Спасибо @pavan за то, что указал мне на место. Поток закрыт.

Комментарии:

1. Рад, что вы разобрались с этим 🙂