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
希望这证明对某人有用 - 并查看视频教程,它非常简洁 运行 通过(非常值得订阅)!
史蒂夫。
我想创建一个表单,通过关系更新用户的 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
希望这证明对某人有用 - 并查看视频教程,它非常简洁 运行 通过(非常值得订阅)!
史蒂夫。