Rails 创建一个表单来更新 has-many-through 实例变量

Rails creating a form to update a has-many-through instance variable

我想创建一个表单,通过关系更新用户的 has_many。更具体地说,每个用户都有很多工作日(模型运行良好),我想添加一个表单来添加额外的工作日,可以从复选框中选择。作为参考,(删节)模型是:

class User < ActiveRecord::Base
  has_many :user_weekdays, dependent: :destroy
  has_many :weekdays, -> { uniq }, through: :user_weekdays
end

class Weekday < ActiveRecord::Base
  has_many :user_weekdays
  has_many :users, -> { uniq }, through: :user_weekdays
end

即'User.find(1).weekdays' 目前可能 return 周日和周一,但我希望有一个表格提供所有工作日的列表,并在提交时将选定的那些推送到 user.weekdays。

我假设它应该像 User.find(params[:id]).weekdays << (the form entries) 这样工作,但不知道该怎么做。

我是 Rails 的新手,对于任何不同寻常的形式我都有些不知所措。我该如何构建它?我已经对 SO 进行了搜索,但找不到任何确定的应用。任何关于如何在视图和控制器中实现这一点的建议将不胜感激。提前致谢,史蒂夫。

如果你想在每个工作日显示复选框,那么你可以试试这个代码:

<% Weekday.all.each do |weekday| %>
<%= check_box_tag "user[weekday_ids][]", weekday.id, current_user.weekday_ids.include?(weekday.id) %>
<% end %>

此 "weekday_ids" 包含您选择的工作日 ID,并将在保存时通过 user_weekdays 与您的用户模型相关联。

使用 Ryan Bates 的出色 Railscast on the subject 完成了这项工作。代码如下:

  <%= hidden_field_tag "user[weekday_ids][]", nil %>
  <%= Weekday.all.each do |weekday| %>
    <%= check_box_tag "user[weekday_ids][]", weekday.id, @user.weekday_ids.include?(weekday.id), id: dom_id(weekday) %>
    <%= label_tag dom_id(weekday), weekday.day %><br>
  <% end %>

与上面没有什么不同,尽管这 运行 对我来说非常完美。它不会一开始就保存,因为我没有用 Devise 定义额外的参数(即管理我的用户模型)。修复此问题的代码如下:

def configure_permitted_parameters
  devise_parameter_sanitizer.for(:account_update) do |u|
    u.permit({ weekday_ids: [] }, { wo_type_ids: [] }, :email, :current_password,
            :password_confirmation, :password) 
  end
end

希望这证明对某人有用 - 并查看视频教程,它非常简洁 运行 通过(非常值得订阅)!

史蒂夫。