ruby-on-rails - 以嵌套形式更新 many_to_many 关联
问题描述
对于这个问题,我有三个模型。并使用wicked
gem 进行多步骤注册。
用户
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
解决方案
您的强大参数需要一个数组,因此您需要:
def user_params
params.permit profile_attributes: [..., specialty_ids: []]
end
推荐阅读
- javascript - 输入键问题上的数据表单个列搜索
- events - CQRS:具有查询或查找服务的复杂事件处理程序
- python - 如何访问列表中的实例对象并显示那里的数据?在蟒蛇
- reactjs - 如何使用 useRef 在 React Hooks 中获取被点击的元素
- .net - .net Core / Blazor:@onkeypress="@(e => OnKeyPressEvent(e))" 在将应用程序部署到 IIS 时无法正常工作:
- python - Django:如何创建用户并设置其相关字段
- java - Android Studio 不会导入 androidx.annotation.NonNull。虽然编译得很好
- java - 编写一个带有构造函数的类 Car,该构造函数接受 yearModel、make 和 speed(以 MPH 为单位)作为其参数
- python - 如何在 Pygame 中只注册一次鼠标单击?
- android - APK 需要有效的隐私政策(上传用户的电子邮件帐户信息)