尝试做一些非常简单的事情。
我有一个系统 客户端 谁有 任务 其中有 文件和笔记
我还可以创建一个与某个特定客户无关的任务。
我希望能够从客户端屏幕创建一个新任务,并填充客户端字段(或在后台填充它),而不必选择它。 当然,如果我只是创建一个任务然后想要将客户端附加到它,我将需要我的客户端选择器。
希望一切都有意义
我有一个嵌套路线如下:
resources :clients do
resources :notes
resources :tasks do
resources :notes
resources :task_files
end
end
resources :tasks do
resources :notes
resources :task_files
end
与嵌套属性等相关的大量内容有效。
我无法解决的一件事是,当我只创建一个任务时,以及当我知道客户端时创建任务时,如何使用相同的_form。 例如客户/:ID /任务/新 VS 任务/新
我的直觉是,如果我将@project放入_form a la:
<%= simple_nested_form_for [@client,@task], html:{multipart: true} do |f| %>
然后它不适合没有客户的任务 鉴于:
<%= simple_nested_form_for @task, html:{multipart: true} do |f| %>
不预先选择客户端:
<%= f.input :client_id, :collection => Client.accessible_by(current_ability, :read), :as => :select, :label => "Client" %>
如果没有预先选择客户端,则使用哪个。
我是如何通过某种方式使用@ client.id参数来实现的? 尝试过@Client,@ Client.id和:client_id没有任何快乐。
我相信这一定非常简单......
澄清: 如果客户端存在(即通过URL知道),我想预先选择客户端,不允许更改它。 如果客户端ID不存在,我希望用户能够选择适用的客户端(或将其留空)。
答案 0 :(得分:1)
听起来你只是用这个表单创建一个任务,而且从不创建一个客户端,所以我只想用
<%= simple_form_for @task do |f| %>
然后包含制作新任务的所有输入。 在创建任务的表单中,您可以检查@user的用户实例变量是否定义为not。如果您处于嵌套路由,则应定义它,并且您只能使用隐藏字段来分配client_id。
<% if defined?(@user) %>
<%= f.hidden_field, :client_id, value: @user.id %>
<% else %>
<%= f.input :client_id, :collection => Client.accessible_by(current_ability, :read), :as => :select, :label => "Client", :value_method => :id %>
<% end %>
答案 1 :(得分:1)
使用selected: params[:client_id]
结束,这使我在表单上留下了选择器但完成了工作。
<%= f.input :client_id, :collection => Client.accessible_by(current_ability, :read), selected: params[:client_id], :label => "Client", :include_blank => "" %>
或者,可以执行以下操作(类似于下面的答案但不同的方法),在某些情况下可能比使用所选方法更清晰。
if params.has_key?[:client_id]
....
else
....
end