搜索结果不打印?

时间:2016-02-17 20:44:26

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

我在我的application.html.erb标题中构建了一个搜索栏,允许访问者在我的网站上搜索“用户”,点击“提交”按钮显示搜索结果后,发现结果似乎不合适在我的页面上打印(它只是空白)。

我在我的users文件夹下创建了index.html.erb,以及_user.html.erb,所以我不确定为什么会发生这种情况(据我所知,_user.html.erb是必要的显示找到/渲染的结果)?

我应该在_user.html.erb中放置一行代码吗?

以下是 index.html.erb 中的内容:

<% if @user.present? %>
  <%= render @user %>
<% else %>
  <p>There are no posts containing the term(s) <%= params[:search] %>.</p>
<% end %>

如果您需要我的其他文件:

users_controller.rb

def index
  @user = User.all
  if params[:search]
    @user = User.search(params[:search]).order("created_at DESC")
  else
    @user = User.all.order('created_at DESC')
  end
end

user.rb

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

2 个答案:

答案 0 :(得分:0)

您的search方法没有结果,这就是您之后看不到任何结果的原因。更改您的where语句,因为它创建和AND查询,您可能正在寻找OR。请尝试类似:

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

希望这有帮助

答案 1 :(得分:0)

视图

通常不会将params传递回视图 - 主要是我认为因为它会针对每个请求进行更改,并且最终可能会与您的预期不同。您可能希望将其复制到控制器中的实例变量。

<% if @users.present? %>
  <%= render @users %>
<% else %>
  <p>There are no posts containing the term(s) <%= @search %>.</p>
<% end %>

部分

<强> _user.html.erb

<%= user.firstname %> <%= user.lastname%>

控制器

  1. Scrap @user = User.all,它什么也没做。
  2. 您将返回多个用户;为了便于阅读,您的变量应该被称为@users
  3. .all条款中的else废话,没有必要。
  4. 应该是:

    def index
      @search = params[:search]
      if @search
        @users = User.search(@search).order("created_at DESC")
      else
        @users = User.order('created_at DESC')
      end
    end
    

    模型

    where("firstname LIKE ?", "%#{search}%")被忽略了。它运行它,但抛出结果并仅返回下一行的结果。你想要:

    def self.search(search)
      where("firstname LIKE :p OR lastname LIKE :p", p: "%#{search}%")
    end
    

    多字段搜索

    - 从单个参数中搜索多个令牌的多个字段

    如果你想尝试这个,你是受虐狂。但这是可能的,而且我之前已经做过了。

    注意:这是为SQL Server 2008编写的,因为那是我公司当时使用的。某些SQL函数(尤其是IsNullLIKE)可能会有所不同,具体取决于您使用的内容。

    class User
      scope :search, ->(value) do
        # This allows tokens containing A-z, 0-9, _, and %. Anything else is treated
        # as a delimiter.
        multi_field_search(%w[firstname lastname], value.split(/[^\w%]/))
      end
    
      # This scope is generic, and reusable for any combination of string fields in
      # any model.
      scope :multi_field_search, ->(fields, values) do
        # You're looking in these fields...
        fields_clause = fields.select(&:present?).map do |field|
          "IsNull(#{field}, '')"
        end.join(" + ' ' + ")
    
        # ... for these values...
        values_clause = sanitize_conditions(values.select(&:present?).map do |value|
          "combo_view.combination LIKE '%#{value}%'"
        end.join(' AND '))
    
        # ... and you do it by constructing a query to join the fields together, and
        # searching for each token of the search parameter individually.
        joins(<<-SQL).where(values_clause)
          INNER JOIN (
            SELECT *, #{fields_clause} AS combination
            FROM #{table_name}
          ) AS combo_view ON #{table_name}.#{primary_key} = combo_view.#{primary_key}
        SQL
      end
    
      # ...
    end