![](/img/trans.png)
[英]What's the difference between using nested routes vs. accepts_nested_attributes_for?
[英]Using nested routes and nested attributes together (and optionally)
嘗試做一些非常簡單的事情。
我有一個系統,其中有一些客戶端,這些客戶端的任務包含文件和注釋
我還可以創建與一個特定客戶端無關的任務。
我希望能夠從客戶端屏幕創建一個新任務,然后填充客戶端字段(或在后台填充該字段),而不必選擇它。 當然,如果我只是創建一個任務,然后想將客戶端附加到該任務,則需要使用客戶端選擇器。
希望一切都有意義
我有一個嵌套的路由,如下所示:
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 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不存在,我希望用戶能夠選擇它適用於哪個客戶端(或將其留空)。
聽起來您只是使用這種形式創建任務,而從未創建客戶端,所以我只會使用
<%= 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 %>
最后使用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.