将表单路由到Ruby on Rails中的新控制器操作

我对Ruby on Rails相对较新,我正在尝试在现有控制器上设置一个带有新操作的表单。

我现有的模型和控制器称为“项目”,我在控制器中创建了一个名为“queue”的新操作。 目标是用户可以使用“/ 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

  "select_user", :method => "post") do %>   'Enter a user...', class: "users", data: {autocomplete_source: User.order(:lastname, :firstname).map { |u| {:label => u.firstname + " " + u.lastname, :id => u.id} }}) %>  

当我提交此表单时,它会提交为“队列/队列”,为了直接链接到此操作,我需要执行以下操作:

  

我所知道的不正确。

我的问题是如何将表单提交为“队列/用户名”? 这应该在一个新的“队列”控制器中单独处理路由吗? 任何帮助表示赞赏。

Rails版本 3.2.13

Ruby版本 1.9.3

Josh和Billy的答案可以很好地完成这个任务,并将另外一个帽子投入到混合中,我建议将其作为基于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请求。 但由于看起来你是通过post请求发布id,这有点令人困惑。 选择只是使用发布请求你不需要像Billy建议的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 

希望这是有道理的!

两个地方要修改:

  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 %> 

你可以改变你的路线

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

然后有目的地

 projects_queue(current_user)