【问题标题】:Generate search results for users by city in Rails 4在 Rails 4 中按城市为用户生成搜索结果
【发布时间】:2015-07-06 22:27:42
【问题描述】:

目前,我正在尝试在项目中创建搜索,以根据用户所在的地区来显示用户。据我了解,我基本上需要将搜索参数放在控制器中,将self.search方法放在模型中,然后将表单放在视图中。

在另一个项目中,我进行了搜索,但它显示了上面的所有选项,并使用搜索过滤掉那些不匹配的选项。对于这种情况,我不想在一开始就列出任何用户。我想使用搜索栏并在该视图页面中显示任何匹配的用户。此外,如果确实有所作为,我会为用户使用 Devise。这是我的三个代码区域:

模型(user.rb):

def self.search(search)
where("state ILIKE ?", "%#{search}%") 
end

控制器(welcome_controller.rb):

def index
    @users = User.all.order("created_at DESC")
    @newusers = User.all.order("created_at DESC").limit(5)
    @differentlocations = User.all.group_by(&:state).count
render :layout => 'with_newest_members'
if params[:search]
    @users = User.search(params[:search]).order("created_at DESC")
  else
    @users = User.all.order('created_at DESC')
  end
end

查看(find.html.erb):

<%= form_tag(find_path, :method => "get") do %>
<%= text_field_tag :search, params[:search], placeholder: "Search Posts" %>
<%= submit_tag "Search", :name => nil %>
<% end %>

如果您有任何知识可以帮助我,请告诉我 =) 任何额外的解释将不胜感激,以帮助我理解,谢谢!

编辑:我知道我需要输入结果部分,但我对如何/在哪里放置它感到困惑。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 search devise


    【解决方案1】:

    回答:

    问题出在我的控制器中,因为我在搜索代码之前有一个渲染命令。控制器应该是:

    def index
    @users = User.all.order("created_at DESC")
    @newusers = User.all.order("created_at DESC").limit(5)
    @differentlocations = User.all.group_by(&:state).count
    if params[:search]
    @users = User.search(params[:search]).order("created_at DESC")
     else
    @users = User.all.order('created_at DESC')
    end
    render :layout => 'with_newest_members'
    end
    

    太棒了 =)

    【讨论】:

      【解决方案2】:

      两件小事可能会有所帮助:

      1) 在您的搜索模型中,我相信您的 search 方法中有错字。它应该是这样的:

      def self.search(search)
        where("state LIKE ?", "%#{search}%")
      end
      

      您可能还想为您的参数考虑更多描述性名称,例如state

      2) 在您的表单中,您无需在任何地方显式写入params[:search]。将在控制器中为您生成 params 哈希,其中 text_field 的名称作为键,用户输入的值作为值(参见 Ruby 文档here)。在这种情况下,使用 :search 作为 text_field_tag 名称的名称。

      <%= form_tag(find_path, :method => "get") do %>
        <%= text_field_tag :search, placeholder: "Search Posts" %>
        <%= submit_tag "Search", :name => nil %>
      <% end %>
      

      更多关于 FormHelpers here.

      【讨论】:

      • 我很欣赏输入,但它不起作用 =( 1. 我没有搜索模型,这是我的用户模型,因为我正在搜索用户。我有 ILIKE 的原因LIKE 是因为我读到如果使用 Postgress(我是),我可能需要改用 ILIKE,但不确定这是否绝对正确。2:感谢您提供的资源和很高兴知道但是当我不放参数,那么搜索字段里面有“搜索”这个词。不管这些,我仍然没有显示结果。
      • 你是对的 - ILIKE 不是错字;它提供case insensitive matching。在#2上,我应该更清楚。 text_field_tag 使用以下语法:text_field_tag(name, value = nil, options = {})。在您的代码中,您将 :search 作为字段名称,将 params[:search] 作为值。不要使用params[:search] 作为值。将该值留空。 Rails 将使用字段名称 (:search) 和用户输入的值将 params[:search] =&gt; "whatever the user inputs" 传递给您的控制器。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-08
      • 2013-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多