如何将复选框值(客户端ID)添加到用户属性(User.clients)

时间:2016-06-28 06:55:04

标签: ruby-on-rails ruby-on-rails-4 activerecord

我一直在努力让这个教程遵循教程。我已经让拥有个人资料的用户和一个客户端模型通过“多对多”来实现。 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;
&#13;
&#13;

路线

&#13;
&#13;
get 'assign_clients/:id', to: 'users#assign_clients'
&#13;
&#13;
&#13;

最后在我的 users_controller.erb

&#13;
&#13;
def assign_clients
  @user = User.find(params[:id])
  @user.client_ids = [1,2]
  redirect_to :back, alert: 'Assigned Users'
end
&#13;
&#13;
&#13;

显然它只是使用1和2的硬编码值。我不知道该怎么做将复选框包装在正确的表单标签/ simple_form(我正在使用)中,然后通过&#39;提交&#39;按钮,有那个&#39; assign_clients&#39;通过值的动作。

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

您需要了解几个基本概念,让我向您解释一下:

  1. on: member路由 - 为了直接解决您的问题,您的路线应该是这样的:

    resources :users do
      post '/assign_clients/:client_id', on: :member
    end
    
  2. 因此除了user_id之外,:client_id也可以作为参数传入。有关详细信息,请参阅rails guides on routing

    1. 对于复选框方式,您需要nested_attributes - http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html。这样您就可以通过对用户的简单update调用来实现您的需求。

    2. 您还可以实现自定义逻辑,并将client_ids作为参数传入。为了学习形式和方式参数在rails中工作,您可以构建表单,提交表单,并查看它在rails服务器日志中的运行方式。

    3. 如果有什么不清楚,只需在下面评论&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