我一直在努力让这个教程遵循教程。我已经让拥有个人资料的用户和一个客户端模型通过“多对多”来实现。 join table,建立用户与客户之间的关系。
我尝试做的是创建一个复选框列表,该列表是从数据库中的客户列表生成的,您可以打开或关闭,然后当您提交它时,用户将拥有关系那些客户通过联接表。
它可以处理静态数据,如下所示:
/profiles/show.html.erb
<% @clients.all.each do |client| %>
<li>
<%= check_box_tag "user[client_ids][]", client.id %>
<%= client.client_name %>
</li>
<% end %>
<%= link_to 'Add Clients', '../assign_clients/' + @profile.user.id.to_s , class: 'btn btn-default' %>
&#13;
路线
get 'assign_clients/:id', to: 'users#assign_clients'
&#13;
最后在我的 users_controller.erb
中
def assign_clients
@user = User.find(params[:id])
@user.client_ids = [1,2]
redirect_to :back, alert: 'Assigned Users'
end
&#13;
显然它只是使用1和2的硬编码值。我不知道该怎么做将复选框包装在正确的表单标签/ simple_form(我正在使用)中,然后通过&#39;提交&#39;按钮,有那个&#39; assign_clients&#39;通过值的动作。
感谢您的帮助。
答案 0 :(得分:0)
您需要了解几个基本概念,让我向您解释一下:
on: member
路由 - 为了直接解决您的问题,您的路线应该是这样的:
resources :users do
post '/assign_clients/:client_id', on: :member
end
因此除了user_id之外,:client_id也可以作为参数传入。有关详细信息,请参阅rails guides on routing。
对于复选框方式,您需要nested_attributes
- http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html。这样您就可以通过对用户的简单update
调用来实现您的需求。
您还可以实现自定义逻辑,并将client_ids作为参数传入。为了学习形式和方式参数在rails中工作,您可以构建表单,提交表单,并查看它在rails服务器日志中的运行方式。
如果有什么不清楚,只需在下面评论&amp;我会尝试更新。
答案 1 :(得分:0)
我不确定该怎么做是以正确的形式包装复选框 tag / simple_form(我正在使用),然后使用&#39; submit&#39;按钮, 有那样做'assign_clients&#39;通过的行动 值。
为了创建一个触发assign_clients方法的表单,需要在routes.rb文件中设置一个路径,如下所示:
resources :users do
patch 'assign_clients', to: 'users#assign_clients', as: 'assign_clients'
end
这为用户设置了一条路径,您可以使用http补丁方法(即UPDATE)。计划是将client_ids作为表单中的params传递给用户控制器。我给它一个路径名,以便我们可以在表单中引用它作为user_assign_clients_path(:user_id)
现在我们已经设置了路由...使用默认的rails表单标签,您可以按照以下方式构建表单:
<%= form_for @user, url: user_assign_clients_path(@user) do |f| %>
<% @clients.each do |client| %>
<li>
<%= check_box_tag "user[client_ids][]", client.id, @user.clients.include?(client) %>
<%= client.client_name %>
</li>
<% end %>
<%= f.submit "Add Clients", class: "btn btn-default" %>
<% end %>
这将创建一个表单,允许您将所选客户端作为id数组发布到assign_clients方法。
最后,assign_clients方法然后可以从params哈希中检索client_ids(最有可能通过params [:user] [:client_ids])并更新用户实例(也可以使用params hash中的user_id检索)。您可能需要将client_ids: []
添加到强参数列表的末尾,以便用户将其列入白名单 - 但这基本上应该像典型的更新方法一样。
def assign_clients
@user = User.find(params[:user_id])
@user.update(user_params)
redirect_to wherever_path
end
def user_params
params.require(:user).permit(
client_ids: []
)
end