ruby on rails-如何将复选框值(客户端ID)添加到User属性(User.clients)中



我一直在努力让它在教程中发挥作用。我有一个具有配置文件的用户和一个客户端模型,该模型通过"多对多"联接表建立用户和客户端之间的关系。

我想做的是创建一个复选框列表,这些复选框是从DB中的客户端列表中生成的,你可以勾选或勾选,然后当你提交它时,用户将通过联接表与这些客户端建立关系。

它在某种程度上处理静态数据,正如你在下面看到的:

/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' %>

路线

get 'assign_clients/:id', to: 'users#assign_clients'

最后在我的users_controller.erb

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

显然,它只是使用硬编码的值1和2。我不知道如何将复选框包装在正确的表单标记/simple_form(我正在使用(中,然后使用"提交"按钮,让其执行传递值的"assign_clients"操作。

谢谢你的帮助。

我不知道如何将复选框包装成正确的形式tag/simple_form(我正在使用(,然后单击"提交"按钮,让其执行"assign_clients"操作,该操作通过价值观

为了创建一个触发assign_clients方法的表单,需要在routes.rb文件中设置一个路由,如下所示:

resources :users do
  patch 'assign_clients', to: 'users#assign_clients', as: 'assign_clients'
end

这为用户设置了一个路由,您可以使用http补丁方法(即UPDATE(。计划是将client_id作为表单中的params传递给users控制器。我给了它一个路径名,这样我们就可以在表单中引用它作为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_id(很可能通过params[:user][:client_ids](,并更新用户实例(也使用params散列的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

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

  1. on: member路由-为了直接解决您的问题,您的路由应该类似于:

    resources :users do
      post '/assign_clients/:client_id', on: :member
    end
    

因此,除了user_id之外,:client_id也可以作为参数传入。有关详细信息,您可以阅读有关路线导轨的信息。

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

  2. 您还可以使用作为参数传入的client_ids来实现自定义逻辑。为了学习如何形成&参数在rails中工作,您可以构建一个表单,提交它,并在rails服务器日志中查看它的运行情况。

如果有什么不清楚的地方,请在下面评论;我会尝试更新。

最新更新