我对rails很新。我正在制作经典的twitter克隆。我希望在我的主页上有一个搜索栏,允许用户搜索推文句柄,如果句柄存在,它会将用户发送到该推文句柄的显示页面。
我一直在关注如何实现简单搜索的RailsCast,但不是像视频一样在索引上进行,我想在show动作上进行。我遇到了一些问题。表单位于我的用户索引视图中。 这是错误:
ActionController::UrlGenerationError in Users#index
Showing c:/Sites/Projects/twitterapp/twitter/app/views/users/index.html.erb where line #2 raised:
No route matches {:action=>"show", :controller=>"users"} missing required keys: [:id]
以下是表格:
<%= form_tag(user_path, method: 'get') do %>
<%= text_field_tag(:search, params[:search]) %>
<%= submit_tag("Search", name: nil) %>
<% end %>
这是我的节目动作:
def show
@user = User.search(params[:search])
end
这是我的用户模型中的搜索方法:
def self.search(search)
if search
find(:all, conditions:['name LIKE ?', "%#{search}%"])
else
find(:all)
end
end
答案 0 :(得分:0)
实际上,您无法使用show
方法作为搜索结果查找器。因为根据rails惯例:
对于resource
之类的任何users
,rails scaffold会生成索引,新,显示,创建基于路线文件的strong>,更新,删除方法。
因此,基于传统方式,show
方法总是要求object
。假设您使用的是UserContoller
show方法。它要求一个user
对象。你还没有在表格中提供。这就是为什么:id
错过了错误的原因。
我会告诉你做更多的学习。并且搜索在不同的控制器中创建不同的方法,并将该控制器方法定义到routes.rb
文件。这是最好的方法。
如果您仍想使用show
方法,请从show
文件更改routes.rb
方法路由。您可以在路径文件上手动声明show动作。
答案 1 :(得分:0)
您正在使用user_path
并且路径需要通知来自当前用户的ID
你可以在行动中做到这一点:索引,但我建议你为这个
创建一个动作<强> 视图 强>
<%= form_tag(search_users_path, method: 'get') do %>
<%= text_field_tag(:search, params[:search]) %>
<%= submit_tag("Search", name: nil) %>
<% end %>
<强> 的routes.rb 强>
resources :users do
post 'search', :on => :collection
end
<强> users_controller.rb 强>
def search
@user = User.search(params[:search])
end
您应该创建与search.html.erb
index.html.erb
答案 2 :(得分:0)
正如Emu和Breno指出导致问题的原因user_path
需要用户id
解决方案的想法: 为什么不直接指向用户索引动作?像这样:
<%= form_tag(users_path, method: 'get') do %>
<%= text_field_tag(:search, params[:search]) %>
<%= submit_tag("Search", name: nil) %>
<% end %>
<强> users_controller.rb:强>
def index
if params[:search]
@user = User.search(params[:search])
end
end
您可以使用ajax
remote: true
来处理返回的用户对象
答案 3 :(得分:0)
通过Google找到您的问题,但回复和建议对我没有用。找到了另一个解决方案,所以似乎值得在这里发布。
&#34;搜索和过滤Rails模型而不会让控制器膨胀&#34;: http://www.justinweiss.com/articles/search-and-filter-rails-models-without-bloating-your-controller/