如何修改Rails中的嵌套参数?
How to modify nested params in Rails?
我正在研究类似的 app.I 有 3 个模型:用户、组和 Relation.I 想制作一个表单,登录用户可以在其中创建一个组并邀请一所大学(其他用户注册在数据库中)。我正在使用 has_many 到 association.Here 是这些模型:
class Group < ApplicationRecord
has_many :relations
has_many :users, through: :relations
accepts_nested_attributes_for :relations
end
class Relation < ApplicationRecord
belongs_to :group
belongs_to :user
end
class User < ApplicationRecord
attr_accessor :remember_token
has_many :transactions, dependent: :destroy
has_many :relations
has_many :groups, through: :relations
<some validation >
end
我的群组控制器
class GroupsController < ApplicationController
def new
@group = Group.new
@group.relations.build
end
def create
@group = Group.new(groups_params)
if @group.save
flash[:success] = "Group has been created!"
redirect_to root_path
else
flash[:danger] = "Something went wrong!"
render 'groups/new'
end
end
private
def groups_params
params.require(:group).permit(:group_name, :group_from, :group_to,
relations_attributes: Relation.attribute_names.map(&:to_sym) )
#Relation.attribute_names.map(&:to_sym) this grabs all the column names
#of the relations tabel, puts it in the array and maps each element with hash
#[:id, :group_id, :user_id, :created_at, :updated_at]
end
end
以及我对“新”行动的看法
<%= provide(:title, "New Group") %>
<div class="row">
<div class="col-md-6 col-md-offset-3">
<%= form_for @group do |group| %>
<%= group.label :group_name, "Group name"%>
<%= group.text_field :group_name %>
<%= group.label :group_from, "Group from"%>
<%= group.date_field :group_from %>
<%= group.label :group_to, "Group to"%>
<%= group.date_field :group_to %>
<!-- :relations is a symbol for assosiation between the group and user -->
<%= group.fields_for :relations do |relations_form| %>
<%= relations_form.label :user_id, "Member #1" %>
<%= relations_form.text_field :user_id %>
<% end %>
<%= group.submit "Create a group!" %>
<% end %>
</div>
</div>
截图:https://i.stack.imgur.com/u1LDX.png
使用此代码,登录用户可以同时创建群组记录和关系记录,但它必须传递要邀请加入群组的用户 ID(例如:“7”而不是“John”- id 为 7 的用户名)
我想要实现的是获取传入“Member #1”field.Example 的用户名的 ID:
1.A 登录用户在“Member #1”字段中输入:“John”
2.Some 函数获取“John”的 id - 修改参数
3.if“John”存在于用户标签中然后保存组->创建组记录和关系记录。
我想我必须修改嵌套参数,但我不知道该怎么做。
谢谢你的帮助,
卢卡斯
您应该尝试使用 select 下拉菜单,而不是输入文本字段,您可以在其中选择现有成员。像这样它会向用户显示名称,但它会 select 发送给控制器的 ID。
我正在研究类似的 app.I 有 3 个模型:用户、组和 Relation.I 想制作一个表单,登录用户可以在其中创建一个组并邀请一所大学(其他用户注册在数据库中)。我正在使用 has_many 到 association.Here 是这些模型:
class Group < ApplicationRecord
has_many :relations
has_many :users, through: :relations
accepts_nested_attributes_for :relations
end
class Relation < ApplicationRecord
belongs_to :group
belongs_to :user
end
class User < ApplicationRecord
attr_accessor :remember_token
has_many :transactions, dependent: :destroy
has_many :relations
has_many :groups, through: :relations
<some validation >
end
我的群组控制器
class GroupsController < ApplicationController
def new
@group = Group.new
@group.relations.build
end
def create
@group = Group.new(groups_params)
if @group.save
flash[:success] = "Group has been created!"
redirect_to root_path
else
flash[:danger] = "Something went wrong!"
render 'groups/new'
end
end
private
def groups_params
params.require(:group).permit(:group_name, :group_from, :group_to,
relations_attributes: Relation.attribute_names.map(&:to_sym) )
#Relation.attribute_names.map(&:to_sym) this grabs all the column names
#of the relations tabel, puts it in the array and maps each element with hash
#[:id, :group_id, :user_id, :created_at, :updated_at]
end
end
以及我对“新”行动的看法
<%= provide(:title, "New Group") %>
<div class="row">
<div class="col-md-6 col-md-offset-3">
<%= form_for @group do |group| %>
<%= group.label :group_name, "Group name"%>
<%= group.text_field :group_name %>
<%= group.label :group_from, "Group from"%>
<%= group.date_field :group_from %>
<%= group.label :group_to, "Group to"%>
<%= group.date_field :group_to %>
<!-- :relations is a symbol for assosiation between the group and user -->
<%= group.fields_for :relations do |relations_form| %>
<%= relations_form.label :user_id, "Member #1" %>
<%= relations_form.text_field :user_id %>
<% end %>
<%= group.submit "Create a group!" %>
<% end %>
</div>
</div>
截图:https://i.stack.imgur.com/u1LDX.png
使用此代码,登录用户可以同时创建群组记录和关系记录,但它必须传递要邀请加入群组的用户 ID(例如:“7”而不是“John”- id 为 7 的用户名) 我想要实现的是获取传入“Member #1”field.Example 的用户名的 ID: 1.A 登录用户在“Member #1”字段中输入:“John” 2.Some 函数获取“John”的 id - 修改参数 3.if“John”存在于用户标签中然后保存组->创建组记录和关系记录。
我想我必须修改嵌套参数,但我不知道该怎么做。 谢谢你的帮助, 卢卡斯
您应该尝试使用 select 下拉菜单,而不是输入文本字段,您可以在其中选择现有成员。像这样它会向用户显示名称,但它会 select 发送给控制器的 ID。