2013-04-29 81 views
1

我對Ruby on Rails比較新,並且試圖在現有控制器上設置新操作的表單。在Ruby on Rails中將表單路由到新的控制器操作

我現有的模型和控制器被稱爲'項目',並且我在控制器中創建了一個名爲'隊列'的新動作。目標是用戶可以使用'/ queue/username'過濾不同用戶的項目。

的routes.rb

match 'queue/:username' => 'projects#queue' 

projects_controller.rb

def queue 
    if (params[:user_id].blank? && params[:user_id].nil?) 
     @projects = Project.find_all_by_user_id(User.where(:username => params[:username]).pluck(:id)) 
    else 
     @projects = Project.find_all_by_user_id(params[:user_id]) 
    end 
    end 

queue.html.erb

<%= form_tag("queue", :id => "select_user", :method => "post") do %> 
    <%= hidden_field_tag('user_id', '') %> 
    <%= text_field_tag('user', nil, :placeholder => 'Enter a user...', class: "users", 
         data: {autocomplete_source: User.order(:lastname, :firstname).map { |u| {:label => u.firstname + " " + u.lastname, :id => u.id} }}) %> 
<% end %> 

當I S ubmit這種形式提交的「隊列/隊列」,而爲了有一個直接鏈接到這個動作我需要做的:

<%= link_to "Queue", queue_path + "/" + current_user.username.to_s %> 

我知道是不正確的。

我的問題是如何獲取表單作爲'隊列/用戶名'提交?是否應該在一個新的「隊列」控制器中分別處理路由?任何幫助表示讚賞。

的Rails版本3.2.13

的Ruby版本 1.9.3

+0

您使用的是什麼版本的rails和ruby? – 2013-04-29 16:33:54

+0

更新了我的問題:Rails:3.2.13,Ruby:1.9.3。 – Drew 2013-04-29 16:36:19

回答

1

約什和比利的答案都可以做到這一點很好,把另一頂帽子加入混音中我建議根據projects製作這條路線。假設你的路線休息和包含的項目爲resources projects

resources :projects do 
    post "queue", :on => :collection 
end 

這樣做是路線projects/queue添加到您的路線,因爲它是基於關閉的集合,而不是一個成員。有關更多信息,請參閱:http://guides.rubyonrails.org/routing.html#adding-more-restful-actions

值得注意的是爲什麼會發生這種情況。這是因爲你最初發布的路由只有queue,當你想要的是queue/:id,因爲id是通過url參數指定的,所以你應該使用get請求。但是,因爲它看起來像通過發佈請求發佈該ID,這有點令人困惑。選擇只是使用一個post請求,你不需要比利建議的URL參數,我也同意,因爲這可以讓你保持它但更簡潔。

希望這會有所幫助!

編輯對於用戶名使用

改變你的形式:

<%= form_tag("queue", :id => "select_user", :method => "post") do %> 
    <%= hidden_field_tag(:username) %> 
    <%= text_field_tag('user', nil, :placeholder => 'Enter a user...', class: "users", 
         data: {autocomplete_source: User.order(:lastname, :firstname).map { |u| {:label => u.firstname + " " + u.lastname, :username => u.username} }}) %> 
<% end %> 

假設JS工作,因爲它應該,你只需要填充隱藏字段與:username值,而不是:id 。然後在控制器端的東西:

def queue 
    @projects = Project.find_all_by_username(params[:username]) 
    end 

希望這是有道理的!

+0

感謝所有有用的建議,傑森。有了這個方法,我可以提交表單,但是所有的參數傳入的是文本框的值,我仍然認爲我需要隱藏的字段來傳遞id。 – Drew 2013-04-29 17:27:43

+0

@請你完全正確,道歉我顯然有一個主要的大腦放屁,並由於某種原因閱讀,如果你使用的是選擇字段。我更新了答案以刪除那部分,但以前的原則保持不變。所以你以前的表單,如果通過自動完成JS正確設置應該可以正常工作。 – 2013-04-29 17:36:49

+0

這很有道理,謝謝。我仍然希望傳入用戶名,而不是ID,但這是我將來必須採取的措施。 – Drew 2013-04-29 17:41:48

1

您可以將路線更改爲類似

match 'queue/:username' => 'projects#queue', :as => 'projects_queue' 

然後有目的地

projects_queue(current_user) 
+0

這給了我'未定義的方法'projects_queue'錯誤。 – Drew 2013-04-29 17:01:40

+0

@Drew可能需要是projects_queue_path(current_user) – JoshEmory 2013-04-29 17:02:34

+0

這可以在傳遞'queue/id'時使用,但不是用戶名。 – Drew 2013-04-29 17:05:57

2

兩個地方修改:

  1. 路線。最好使用不帶參數的POST靜態路由,並指定POST

    match 'projects/queue' => 'projects#queue', via: :post 
    
  2. 表單標籤。你需要指定路徑

    <%= form_tag "projects/queue", method: :post do %> 
    

    最好不要使用DIV ID,如果你有,像這樣使用

    <%= form_tag "projects/queue", method: :post, html: {id: "select_user"} do %> 
    
+0

感謝您的回覆。當我添加這些更改時,'projects_queue(current_user)'給了我未定義的方法錯誤,'projects_queue_path(current_user)'給了我'/projects/queue.1'。 1是記錄的ID。有沒有辦法改變這個路由到'隊列/用戶名',而不是id,在鏈接和表單操作? – Drew 2013-04-29 16:54:37

+0

我沒有回答。順便說一句,爲什麼你想擁有這個動態的ID?您的表單可以發佈所有數據。 – 2013-04-29 17:00:52

+0

我正在使用jquery ui自動完成,當他們選擇一個選項時,我正在存儲要提交的選擇的用戶標識。如果有更好的方法來做到這一點,我願意改變它的任何/全部。 – Drew 2013-04-29 17:04:07