代码之家  ›  专栏  ›  技术社区  ›  jordan

以嵌套形式更新多对多关联

  •  0
  • jordan  · 技术社区  · 7 年前

    wicked 多步骤注册的宝石。

    用户

    class User < ApplicationRecord
      has_one :profile
      has_many :specialties, through: :profile
    
      accepts_nested_attributes_for :profile, allow_destroy: true
    end
    

    简况

    class Profile < ApplicationRecord
      belongs_to :user
      has_many :profile_specialties
      has_many :specialties, through: :profile_specialties
    end
    

    专业

    class Specialty < ApplicationRecord
      has_many :profile_specialties
      has_many :profiles, through: :profile_specialties
    end
    

    以我的形式,我通过了 specialty_ids

    <%= simple_form_for @user, url: wizard_path do |f| %>
    
      ...
    
      <%= simple_fields_for :profile_attributes do |cf| %>
    
        <%= cf.input :specialty_ids, collection: Role.order(:name), as: :grouped_select, group_method: :specialties, input_html: {multiple: true} %>
    
      <% end %>
    
      ...
    
    <% end %>
    

    AfterSignup#update

    def update
      @user = current_user
      @user.update_attributes(user_params)
      render_wizard @user
    end
    

    我相信rails通过命名来处理关联的更新。但可能我弄错了,需要显式更新控制器中的关联。或者我没有正确命名物品。。。

    不管怎样,我都有点不清楚为什么个人资料不更新。

    更新

    当我尝试更新时,控制台会记录 Unpermitted parameters: :specialty_ids

    def user_params
      params.permit profile_attributes: [..., :specialty_ids]
    end
    

    更新2

    这是完整的日志

    Processing by AfterSignupController#update as HTML
      Parameters: {"utf8"=>"✓", "authenticity_token"=>"...", "profile_attributes"=>{"specialty_ids"=>["", "22"], "commit"=>"Save and Continue", "id"=>"step_one"}
      User Load (0.7ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 52], ["LIMIT", 1]]
    Unpermitted parameters: :specialty_ids
    Unpermitted parameters: :utf8, :_method, :authenticity_token, :commit, :id
       (0.2ms)  BEGIN
      Profile Load (0.2ms)  SELECT  "profiles".* FROM "profiles" WHERE "profiles"."user_id" = $1 LIMIT $2  [["user_id", 52], ["LIMIT", 1]]
      SQL (0.4ms)  DELETE FROM "profiles" WHERE "profiles"."id" = $1  [["id", 110]]
      SQL (0.4ms)  INSERT INTO "profiles" ("user_id", "created_at", "updated_at") VALUES ($1, $2, $3) RETURNING "id"  [["user_id", 52], ["created_at", "2018-09-06 02:30:57.882173"], ["updated_at", "2018-09-06 02:30:57.882173"]]
       (0.5ms)  COMMIT
       (0.2ms)  BEGIN
       (0.2ms)  COMMIT
    Redirected to http://localhost:3000/after_signup/requirements
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Beartech    7 年前

    您的强参数需要一个数组,因此您需要:

    def user_params
      params.permit profile_attributes: [..., specialty_ids: []]
    end