1

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

我现有的模型和控制器称为“项目”,我在控制器中创建了一个名为“队列”的新动作。目标是用户可以使用“/queue/username”过滤不同用户的项目。

路线.rb

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

项目控制器.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 %>

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

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

我知道这是不正确的。

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

Rails 版本3.2.13

红宝石版本1.9.3

4

3 回答 3

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 %>
    
于 2013-04-29T16:41:27.687 回答
1

您可以将路线更改为类似

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

然后让目的地成为

projects_queue(current_user)
于 2013-04-29T16:37:00.353 回答
1

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 请求。但是,由于看起来您是通过发布请求发布 id,所以这有点令人困惑。选择只使用发布请求,您不需要像比利建议的 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

希望这是有道理的!

于 2013-04-29T17:06:57.133 回答