0

试图做一些非常简单的事情。

我有一个系统,我们的客户有具有文件和注释的任务

我还可以创建与某个特定客户无关的任务。

我希望能够从客户端屏幕创建一个新任务并填充客户端字段(或让它在后台填充)而不必选择它。当然,如果我只是创建一个任务然后想将一个客户端附加到它,我将需要我的客户端选择器。

希望一切都有意义

我有一个嵌套路由如下:

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 ,以及当我知道客户时创建任务时。例如clients/:id/tasks/new vs tasks/new

我的直觉是,如果我将@project 放入 _form 中:

<%= 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 不存在,我希望用户能够选择它适用于哪个客户端(或将其留空)。

4

2 回答 2

1

听起来您只是使用此表单创建任务,而从未创建客户端,所以我会使用

<%= simple_form_for @task do |f| %>

然后包括所有用于制作新任务的输入。在制作任务的表单中,您可以检查@user 的用户实例变量是否定义为未定义。如果你在嵌套路由,它应该被定义,你可以只使用一个隐藏字段来分配 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 %>
于 2013-10-07T18:14:43.140 回答
1

最终使用selected: params[:client_id]which 将选择器留在了表单上,但完成了工作。

<%= 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
于 2013-10-14T16:21:09.723 回答