Fields_for не сохраняет данные при обновлении

Я пытаюсь выполнить действие редактирования для своих пользователей с помощью fields_for. Проблема в том, что он не сохраняет профессиональные параметры в User. Он не будет обновлять атрибуты pro.

У меня есть 2 модели, pro и `user``

Пользователь has_one pro и пользователь pro belongs_to.

В пользовательской модели я добавил: accepts_nested_attributes_for :pro, allow_destroy: true

В контроллере пользователей я добавил:

def user_params
    params.require(:user).permit(:name, :pro, :tos_agreement, :avatar,
                                 :avatar_cache, :is_pro,:email, :password,
                                 :password_confirmation,
                                 pro_attributes: [
                                   :type, :pro_name, :is_pro, :pro_image,
                                   :is_active, :web, :user_id, :about,
                                   :facebook, :twitter, :linkedin, :telephone])
  end

  def edit
    @user = User.friendly.find(params[:id])
  end

  def update
    @user = User.friendly.find(params[:id])
    pro = @user.build_pro
  end

И, наконец, в моем представлении edit.html.erb я добавил к форме:

     <%= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put }) do |f| %>
    <ul class="accordion-submenu">
      <li class="semi_padding">
          <%= f.label :nombre %>
          <%= f.text_field :name, :autofocus => true %>
          <%= f.label :email %>
          <%= f.email_field :email %>
          <%= f.label "Algo sobre tí" %>
          <%= f.text_field :description, placeholder: "Soy una persona amante de la decoración..." %>
          <%= f.label "Lugar" %>
          <%= f.text_field :location , placeholder: "¿De donde eres? Ej: Bilbao"%>
      </li>
    </ul>
  </li>
    <li>
    <a href="javascript:void(0)" class="js-accordion-trigger">
    <i class="icon-switch"> </i> Contraseña</a>
    <ul class="accordion-submenu">
      <li class="semi_padding">
        <%= f.label :contraseña %>
        <%= f.password_field :password, :autocomplete => "off" %>
        <%= f.label "Confirmación de contraseña" %>
        <%= f.password_field :password_confirmation %>
      </li>
    </ul>
  </li>
  <% if @user.has_role :pro %>
   <li>
    <a href="javascript:void(0)" class="js-accordion-trigger">
    <i class="icon-store"> </i> Datos de marca PRO</a>
    <ul class="accordion-submenu">
      <li class="semi_padding">
       <%= fields_for @user.pro do |builder| %>
        <%= builder.label :facebook %>
        <%= builder.text_field :facebook, placeholder: "Facebook URL" %>
        <%= builder.label :twitter %>
        <%= builder.text_field :twitter,  placeholder: "Twitter URL" %>
        <%= builder.label :linkedin %>
        <%= builder.text_field :linkedin,  placeholder: "Linkedin URL"%>
      <% end %>
      </li>
    </ul>
  </li>
  <% end %>

Я вижу, что параметры есть в журналах, но они не сохраняются. Любой совет? Спасибо!

ОБНОВИТЬ:

Started PUT "/users" for 127.0.0.1 at 2015-01-29 19:25:17 +0100
Processing by RegistrationsController#update as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"+6D1uzTbQioSLgcxgnMEJOw1ADTgId8LUrCCwiQXpcg=", "user"=>{"avatar_cache"=>"", "name"=>"User 5", "email"=>"[email protected]", "description"=>"Et doloremque repudiandae alias odit quis rerum.", "location"=>"Bilbao", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "pro"=>{"facebook"=>"TESTTTTTTT", "twitter"=>"TESTTTTTTT", "linkedin"=>"TESTTTTTTT"}, "commit"=>"Modificar"}
  User Load (0.9ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 6 ORDER BY "users"."id" ASC LIMIT 1
  Notification Load (0.3ms)  SELECT "notifications".* FROM "notifications" WHERE "notifications"."user_id" = $1 AND "notifications"."viewed_at" IS NULL ORDER BY "notifications"."created_at" DESC LIMIT 30  [["user_id", 6]]
  Notification Load (0.2ms)  SELECT "notifications".* FROM "notifications" WHERE "notifications"."user_id" = $1 AND (viewed_at IS NOT NULL) ORDER BY "notifications"."created_at" DESC LIMIT 30  [["user_id", 6]]
  User Load (0.2ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT 1  [["id", 5]]
  User Load (0.2ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT 1  [["id", 7]]
  User Load (0.2ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT 1  [["id", 6]]
  User Load (0.2ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1  [["id", 6]]
   (0.1ms)  BEGIN
   (0.1ms)  COMMIT
Redirected to http://localhost:3000/
Completed 302 Found in 23ms (ActiveRecord: 2.2ms)

person Gibson    schedule 29.01.2015    source источник
comment
Куда ты бежишь @user.update(user_params)?   -  person ptd    schedule 29.01.2015
comment
Он отсутствовал, я пробовал с def update @user = User.friendly.find(params[:id]) @user.update(user_params) pro = @user.build_pro(params[:pro_attributes]) end ::: :: Но это не сработает   -  person Gibson    schedule 29.01.2015
comment
Ваши params неверны. У вас нет хэша pro_attributes внутри хеша user. Должно быть проблема с вашей формой. Наверное, потому что fields_for :pro должно быть fields_for @user.pro.   -  person ptd    schedule 29.01.2015
comment
Я думаю, вы правы. Я не знаю, правильны ли мои отношения, потому что @user.pro обнуляется. У меня есть пользователь has_one :pro, а pro принадлежит пользователю. В таблице Pro у меня есть столбец user_id. Я что-то упускаю?   -  person Gibson    schedule 29.01.2015
comment
Добавьте @user.pro.build к вашему действию edit, иначе оно будет nil.   -  person ptd    schedule 29.01.2015


Ответы (2)


Попробуй это :

pro = @user.build_pro (параметры [: pro_attributes])

person Zakaria Acharki    schedule 29.01.2015
comment
Я пробовал это: def update @user = User.friendly.find(params[:id]) @user.update(user_params) pro = @user.build_pro(params[:pro_attributes]) end Но все равно не сохраняется. .. - person Gibson; 29.01.2015
comment
к сожалению, попробуйте еще про.сохранить или обновить в конце концов - person Zakaria Acharki; 29.01.2015
comment
Я добавил журналы, см. Если вы что-то видите! ничего не вижу :( - person Gibson; 29.01.2015
comment
я вижу, что параметры pro не находятся внутри параметров пользователя - person Zakaria Acharki; 29.01.2015
comment
Где может быть проблема? Может в fields_for :pro? - person Gibson; 29.01.2015
comment
правильная форма: "user"=>{"avatar_cache"=>"", "name"=>"User 5", "pro"=>{"facebook"=>"TESTTTTTTT"... } } - person Zakaria Acharki; 29.01.2015
comment
Попробуйте это: '‹%= fields_for :pro , @user.pro do |builder| %›' - person Zakaria Acharki; 29.01.2015
comment
Все еще получаю то же самое: Параметры: {utf8=›✓, authentication_token=›+6D1uzTbQioSLgcxgnMEJOw1ADTgId8LUrCCwiQXpcg=, user=›{avatar_cache=›, name=›User 5, email=›[email protected], description=›Et doloremque repudiandae alias odit quis rerum., location=›Bilbao, password=›[FILTERED], password_confirmation=›[FILTERED]}, pro=›{facebook=›asdasd, twitter=›asdasda, linkedin=›sdasd}, commit=›Modificar} Разве это не должно быть pro_attributes? я думаю - person Gibson; 29.01.2015
comment
Добавлено к вопросу - person Gibson; 29.01.2015
comment
Хорошо, теперь попробуйте добавить f перед fields_for следующим образом: <%= **f.**fields_for @user.pro do |builder| %> - person Zakaria Acharki; 29.01.2015

Попробуйте изменить метод сильных параметров, вам нужно передать идентификатор для обновления

params.require(:user).permit(:id, :name, :pro, :tos_agreement, :avatar,
                                 :avatar_cache, :is_pro,:email, :password,
                                 :password_confirmation,
                                 pro_attributes: [
                                   :user_id, :type, :pro_name, :is_pro, :pro_image,
                                   :is_active, :web, :user_id, :about,
                                   :facebook, :twitter, :linkedin, :telephone])
person Igor Belo    schedule 29.01.2015
comment
Я добавил журналы, см. Если вы что-то видите! ничего не вижу :( - person Gibson; 29.01.2015
comment
не могли бы вы вставить вывод метода user_params? - person Igor Belo; 29.01.2015
comment
user=›{avatar_cache=›, name=›User 5, email=›[email protected], description=›Et doloremque repudiandae alias odit quis rerum., location=›Bilbao, password=›[FILTERED], password_confirmation=› [ФИЛЬТРИРОВАНО]}, pro=›{facebook=›TESTTTTTTT, twitter=›TESTTTTTTT, linkedin=›TESTTTTTTT}, commit=›Modificar} - person Gibson; 29.01.2015