【问题标题】:Search form not routing to proper controller in Rails 5.1搜索表单未路由到 Rails 5.1 中的正确控制器
【发布时间】:2017-11-20 04:41:32
【问题描述】:

这几天我一直在苦苦挣扎:

我的导航栏中有一个搜索表单,它通过作业模型在我的用户表的 :address 列中运行搜索。这是我的 JobsController 的 index 方法:

def index
@jobs = if params[:address]
  Job.joins(:user).where(users: { address: params[:address].downcase 
}).paginate(page: params[:page], per_page: 3)
 else
   @jobs = Job.paginate(page: params[:page], per_page: 3).order('id DESC')
 end
end

这是表格:

<form class="navbar-form navbar-left">
<div class="form-group">
  <%= simple_form_for(jobs_path, method: :get) do %>
  <%= text_field_tag :address, params[:address], placeholder: " Votre 
   Ville..." %>
  <%= submit_tag 'Rechercher', class:'btn btn-default' %>
  <% end %>
</div>

这是我的路线文件:

Rails.application.routes.draw do
 devise_for :users

 get 'static_pages/home'

 get 'static_pages/faq'

 get 'static_pages/about'

 get 'static_pages/cgu'

 root   'static_pages#home'

 get    '/faq',    to: 'static_pages#faq'
 get    '/about',   to: 'static_pages#about'
 get    '/contact', to: 'static_pages#contact'
 get    '/cgu',     to: 'static_pages#cgu'
 get    '/signup',  to: 'users#new'
 get    '/login',   to: 'sessions#new'
 post   '/login',   to: 'sessions#create'
 delete '/logout',  to: 'sessions#destroy'


 resources :jobs, only: [:show, :index]
 resources :users do
 resources :jobs
end

resources 'contacts', only: [:new, :create], path_names: { new: '' }

if Rails.env.development?
mount LetterOpenerWeb::Engine, at: "/letter_opener"
end

结束

Jobs 路由存在两次,因为我需要为未登录的用户/访问者提供索引和视图操作

我的部分铁路路线显示:

我的问题是,请求在路由中丢失,有时会转到错误的控制器。如果我在 Jobs#index 页面上:http://localhost:3000/jobs 并搜索像“南特”这样的城市。查询运行良好:

Started GET "/jobs?utf8=%E2%9C%93&address=Nantes&commit=Rechercher" for 
127.0.0.1 at 2017-11-20 08:34:48 +0400
Processing by JobsController#index as HTML
Parameters: {"utf8"=>"✓", "address"=>"Nantes", "commit"=>"Rechercher"}
Rendering jobs/index.html.erb within layouts/application
(0.4ms)  SELECT COUNT(*) FROM "jobs" INNER JOIN "users" ON "users"."id" = 
"jobs"."user_id" WHERE "users"."address" = $1  [["address", "nantes"]]
Job Load (0.6ms)  SELECT  "jobs".* FROM "jobs" INNER JOIN "users" ON 
"users"."id" = "jobs"."user_id" WHERE "users"."address" = $1 LIMIT $2 OFFSET 
 $3  [["address", "nantes"], ["LIMIT", 3], ["OFFSET", 0]]
 User Load (0.3ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 
LIMIT $2  [["id", 1], ["LIMIT", 1]]
CACHE User Load (0.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = 
$1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
Rendered jobs/index.html.erb within layouts/application (43.9ms)
Rendered layouts/_header_out.html.erb (1.8ms)
Rendered layouts/_messages.html.erb (0.5ms)
Rendered layouts/_footer.html.erb (0.6ms)
Completed 200 OK in 119ms (Views: 101.0ms | ActiveRecord: 7.1ms)

如果我从我的根页面运行查询,即:StaticPagesController,查询将发送到 StaticPagesController 而不是 JobsController:

Started GET "/?utf8=%E2%9C%93&address=Nantes&commit=Rechercher" for 127.0.0.1 
at 2017-11-20 08:37:49 +0400
Processing by StaticPagesController#home as HTML
Parameters: {"utf8"=>"✓", "address"=>"Nantes", "commit"=>"Rechercher"}
Rendering static_pages/home.html.erb within layouts/application

无论我身在何处,如何确保始终将查询发送到正确的控制器?我在表格中尝试过的任何方法似乎都不起作用!谢谢各位。

【问题讨论】:

  • 您需要根据您的controlleraction 更改form url。您能否用您的搜索表单的一些视图文件代码更新问题?
  • @Rodolphe 你的form 应该是这样的:form_tag(jobs_path, method: :get)
  • 大家好,我已经更新了我的帖子。是的,表格是正确的。但是路由仍然不起作用,我不知道为什么.....

标签: ruby-on-rails ruby postgresql activerecord


【解决方案1】:

我可以在您提供的表单 sn-p 的顶部看到一个多余的 form 标签。使用 Simple Form 你只需要使用它提供的帮助器:

<%= simple_form_for @user do |f| %>
  <%= f.input :username %>
  <%= f.input :password %>
  <%= f.button :submit %>
<% end %>

这将生成一个带有用户名和密码标签的完整表单,并在您使用无效数据呈现表单时(例如提交后)默认呈现错误。

所以请去掉下面sn-p中表格的第一行:

<form class="navbar-form navbar-left">
<div class="form-group">
  <%= simple_form_for(jobs_path, method: :get) do %>
  <%= text_field_tag :address, params[:address], placeholder: "Votre Ville..." %>
  <%= submit_tag 'Rechercher', class:'btn btn-default' %>
  <% end %>
</div>

然后改写如下:

<div class="form-group navbar-form navbar-left">
  <%= simple_form_for(jobs_path, method: :get) do %>
    <%= text_field_tag :address, params[:address], placeholder: "Votre Ville..." %>
    <%= submit_tag 'Rechercher', class:'btn btn-default' %>
  <% end %>
</div>

【讨论】:

  • 你好瓦西夫。好眼力 。正是这样。冗余表单标签是问题所在。我按照你的建议做了,效果很好。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多