这与我在此处发布的问题有关:Route a form to new controller action in Ruby on Rails
我正在使用表单提交从jquery ui自动完成框中选择的值,并使用隐藏字段来保留id:
<%= form_tag "queue", method: :post, html: {id: "select_user"} 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 %>
Queue是一个名为“Projects”的模型和控制器上的单独操作,因此我可以根据用户检索项目。
的routes.rb
match 'queue' => 'projects#queue', :as => :queue
match 'queue/:id' => 'projects#queue', :as => 'projects_queue'
提交上面的表单时,url现在是'queue / queue',而不是'queue /:id'。有没有办法在控制器中更改此项以添加用户ID?
答案 0 :(得分:1)
您要“排队/排队”的原因是您的表单的操作被设置为相对于当前路径:
<%= form_tag "queue", method: :post, html: {id: "select_user"} do %>
应该是:
<%= form_tag "/queue", method: :post, html: {id: "select_user"} do %>
在'队列'控制器上获取'索引'动作。
如果您希望控制器进行重定向,可以使用redirect_to directive这样的
def index
redirect_to "/queue/"+params[:user_id]
end
另一方面,使用jQuery捕获点击并更改表单的操作可能更容易:
$('#select_user').on('submit', function(e){
var f = $(this);
if(!f.data('action_updated')){
e.preventDefault();
f.attr('action','/queue/'+$('input[name=user_id]', f).val());
f.data('action_updated', true);
f.trigger('submit');
}
}