1

I am relatively new to Ruby on Rails, and am trying to set up a form with a new action on an existing controller.

My existing model and controller is called 'projects', and I created a new action in the controller called 'queue'. The goal is that a user can filter projects by different users using '/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 %>

When I submit this form it submits as 'queue/queue', and in order to have a direct link to this action I need to do:

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

Which I know is not correct.

My question is how do I get the form to submit as 'queue/username'? Should this be in a new 'queue' controller to handle routing separately? Any help is appreciated.

Rails version 3.2.13

Ruby version 1.9.3

4

3 に答える 3

2

修正する 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

ジョシュとビリーからの回答はこれをうまく達成できます。ミックスに別の帽子を投げ込むために、これを に基づくルートにすることをお勧めし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 %>

:usernameJS が正常に機能していると仮定すると、非表示フィールドに の代わりに値を入力するだけで済みます:id。次に、コントローラ側で次のことを行います。

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

これが理にかなっていることを願っています!

于 2013-04-29T17:06:57.133 に答える