铁轨和红宝石的新手。与form_for
协会斗争。我正在尝试设置允许用户从客户端列表中选择的Rails应用程序。客户端通过has_many :through
关系进行关联。我的模型按预期工作,可以通过rails控制台将客户端添加到用户。我现在想将此功能移至Web界面。下面的代码是我尝试过的方式,但是对我来说只是没有意义。我不确定哪个控制器动作是正确的动作。我应该POST
在客户端的create操作中处理表单吗?我实际上并不想创建一个新客户端,我只希望用户从现有客户端列表中进行选择并创建关联。
我的模型如下:
class Client < ActiveRecord::Base
has_many :users, :through => :user_clients
has_many :user_clients, :dependent => :destroy
end
class User < ActiveRecord::Base
has_many :clients, :through => :user_clients
has_many :user_clients, :dependent => :destroy
end
class UserClient < ActiveRecord::Base
belongs_to :user
belongs_to :client
end
路线如下
resources :clients do
resources :users
end
resources :users do
resources :clients
end
客户控制器
class ClientsController < ApplicationController
before_action :set_client, only: [:show, :edit, :update, :destroy]
def index
if params[:user_id]
@clients = User.find_by_id(params[:user_id]).clients
else
@clients = Client.all
end
@clients
end
def create
if params[:user_id]
user = User.find(params[:user_id])
client = Client.find_by_id(params[:client_id])
user.clients << client
user.save
redirect_to users_url
else
@client = Client.new(client_params)
@client.save
redirect_to clients_url
end
end
end
客户端视图中的表单
<h1>new.html.erb</h1>
<% if params[:user_id] %>
<%= form_for([@user,@client]) do |f| %>
<div class="field">
<%= f.label :id %><br>
<%= f.text_field :id %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
<% else %>
<%= render 'form' %>
<% end %>
首先,看一下该gem:Nested Form。这也是有关该主题的两个例子。但是,如果您愿意构建自己的解决方案,则可以从此处阅读有关嵌套属性的文档开始。
希望能帮助到你!
更新。关于您的路线和所有内容。
resources :clients do
resources :users
end
resources :users do
resources :clients
end
您已在此处嵌套资源。就像你在你的评论中提及,users/:user_id/clients/new
并clients/new
会导致同样的动作。这就是这种路由工作的方式。您对Rails的处事风格是正确的-在控制器中进行一些令人恐惧的逻辑检查,并且基本上可以在一个动作中执行不同的事情是非常糟糕的。由于您的操作(将用户与现有客户端相关联)与一组标准的RESTful操作(update
尽管会是最接近的变体)相差很远,因此您需要为资源引入新的操作-例如assign_client
。您可以这样做:
resources :users do
resources :clients
member do
put :assign_client
end
end
您可以按照自己喜欢的任何动作呈现表单。但是,如果您想要更独立的内容,则可以创建一对动作(类似于edit
和update
配对)。第一个将呈现适当的表单,第二个将在服务器上处理该表单。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句