我对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
<%= 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
Ruby版本 1.9.3
答案 0 :(得分:2)
要修改的两个地方:
路线。最好在没有参数的情况下使用静态路由进行POST,并指定POST
match 'projects/queue' => 'projects#queue', via: :post
表单标记。您需要指定路径
<%= form_tag "projects/queue", method: :post do %>
最好不要使用div id,如果必须,请像这样使用
<%= form_tag "projects/queue", method: :post, html: {id: "select_user"} do %>
答案 1 :(得分:1)
您可以将路线更改为
match 'queue/:username' => 'projects#queue', :as => 'projects_queue'
然后将目的地设为
projects_queue(current_user)
答案 2 :(得分: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
,因为通过url参数指定了id,您应该使用get请求。但由于看起来你是通过帖子请求发布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
希望这是有道理的!