搜索框以在rails中查找用户

时间:2016-08-20 04:36:29

标签: ruby-on-rails

我对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

4 个答案:

答案 0 :(得分:0)

实际上,您无法使用show方法作为搜索结果查找器。因为根据rails惯例: 对于resource之类的任何users,rails scaffold会生成索引显示创建更新删除方法。

因此,基于传统方式,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/