簡體   English   中英

一起使用嵌套的路由和嵌套的屬性(可選)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM