2015-06-16 38 views
0

在我的Rails應用程序中,我希望能夠從導航欄中搜索客戶端,並讓它自動向WorkOrderController提供關聯的客戶端。目標是在用戶進入新視圖之前自動生成一些工作訂單信息。我希望通過將新的工作訂單路徑嵌套在客戶端中來實現這一點,但我不確定將表單提交轉換爲查找以返回客戶端以供在工作訂單控制器中使用。很明顯,我錯過了一個方法,但我不知道該把它放在哪裏以及我需要它做什麼。rails通過關聯搜索初始化新對象

據我所知,我需要做的是以某種方式將表單提交給某個方法,然後通過params中的client_id重定向到新的工作訂單頁面。

我完全脫離了這裏的基地還是錯過了一些相對較小的東西?由於大多數指南都討論form_for的功能,一個半小時的搜索量並沒有太多變化。這似乎不是一個完整的搜索。

#routes.rb 
.... 
resources :client do 
    get 'schedule', to: 'work_order#client_schedule' 
    get 'archive', to: 'work_order#client_archive' 
    resources :work_order, only: [:new] 
end  
..... 

#application.html.erb 
..... 
<form class="navbar-form navbar-left" role="search"> 
    <div class="form-group"> 
    <input type="text" class="form-control" placeholder="Enter client number"> 
    </div> 
    <button type="sumbit" class="btn btn-default">New Work Order</button> 
</form> 
..... 

#WorkOrderController.rb 
.... 
def new 
    client = Client.find(params[:client_id]) 
    @workorder = WorkOrder.new(client: client) 
end 
.... 

編輯:

我做了如下改變,現在當我嘗試加載頁面我得到一個錯誤說我失蹤了CLIENT_ID參數,不過我想這就是我要找的首先

<%= form_tag new_client_work_order_path, :method => "get", class: "navbar-form navbar-left" do %> 
    <div class="form-group"> 
    <%= text_field_tag :search, params[:search], class: "form-control", placeholder: "Enter client number"%> 
    </div> 
    <button type="sumbit" class="btn btn-default">New Work Order</button> 
<% end %> 

編輯2: 之所以能夠這樣做,以實現我想要的結果如下:

在work_order_controller.rb

.... 
def new 
    client = Client.find_by(clientnumber: params[:client_number]) 
    @workorder = WorkOrder.new(client: client) 
end 
.... 

我切換路由,使新的路由沒有根據客戶嵌套,然後改變了形式爲:

<%= form_tag new_work_order_path, :method => "get", class: "navbar-form navbar-left" do %> 
    <div class="form-group"> 
    <%= text_field_tag :client_number, params[:client_number], class: "form-control", placeholder: "Enter client number"%> 
    </div> 
    <button type="sumbit" class="btn btn-default">New Work Order</button> 
<% end %> 

,我感到我已經創建了一些其他的問題,我不印象但我可能只是偏執

+0

這是兩個模型之間的關係嗎? –

+0

客戶的has_many工作訂單 工單belongs_to的客戶 –

+0

以及如果他們應該做這樣的事情在您的工作單控制器創建一個新的工作單'@workorder = @ client.workorders.build'如果我認爲你是在一個路由相關然後例如'localhost:3000/clients/1/workorders/new',那麼它應該工作,因爲'@ client'變量應該作爲參數 –

回答

0

快速掃描您的代碼,我沒有看到任何遺漏,雖然有很多方法來完成這個工作,但我認爲你在(a)正確的軌道上。

在Rails中構建這樣的東西需要獲得相當數量的組件,這些組件在同一時間一起工作,所以在這種情況下,我會依次關注每個步驟(按時間順序)以驗證它是否按預期工作。具體來說,我倒是:

  • 觀看Rails的控制檯,當我點擊「新工單」按鈕,確認client_id參數「看到」的控制器。 (仔細檢查,根據你的HTML,我看不出這個表單如何通過這個參數......或者表單將如何提交。表單的action屬性在哪裏?)
  • 使用puts聲明在控制器#new操作驗證client對象是否已正確初始化,並且@workorder.client_id是預期值。
  • 將輸出添加到#new視圖模板,該模板輸出@workorder.client_id以驗證該ID是否轉到視圖。我沒有在上面的代碼片段中看到這個視圖模板,所以我不知道你在期望顯示出來。

等等。只需將問題分解成更小的步驟,以便更容易地找出發生的情況。祝你好運!

+0

我想我正在掙扎最重要的是我需要在表單上使用什麼操作。我想我需要做一個Client.find_by,然後將返回的對象傳遞給new_client_work_order_path,那麼類似的東西會在客戶端控制器? –

+0

儘可能地將想要提交的表單和控制器操作(即處理該提交)視爲兩個完全分離的事物。我將首先寫出你想要的表單,只需簡單的HTML,而不需要Rails助手。然後,一旦你有了它,並驗證它的工作原理,開始使用花哨的Rails窗體幫助器,使表單的HTML代碼更加動態和減少重複。但是這些助手是毫無價值的,除非你100%理解你想要的HTML。 –

+0

我不太清楚「我需要在表單上使用什麼操作」的含義,但是如果您指的是POST表單到哪個URL,某種程度上取決於您。 Rails使用'routes.rb'來定義應該連接到每個控制器方法的URL,如果你遵循約定,你的表單的'action' URL通常就是'/ client_work_orders/183'(當然Rails允許你使用那些羅嗦的路線助手方法,所以你不必明確寫出)。但重要的是要確保表單提交時,最終在正確的控制器操作中結束。 –