【问题标题】:Rails simple search doesn't workRails 简单搜索不起作用
【发布时间】:2017-11-03 04:34:53
【问题描述】:

我在我的 Rails 应用程序中实现了一个简单的搜索。每当我点击搜索时,它不会返回任何结果,但保持不变。

我有一个型号Contract,下面是代码

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

Contract 控制器中,

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

Contractindex.html.erb

<form action="<%= contracts_path%>" method ="get">
<div class="col-lg-6">
  <div class="input-group">
  <%= text_field_tag :search, params[:search], class: 'form-control'%>
  <span class="input-group-btn">
  <%= submit_tag "Search", class: "btn btn-success" %>
  </span>
  </div>
</div>
</form>

<% if @current_user.contracts.present? %>
<% @current_user.contracts.each do |f| %>
    <% if @current_user.contracts.present? %>
    <% @current_user.contracts.each do |f| %>
<tr>
    <td><%= f.contract_name %></td>
    <td><%= f.contract_email %></td>
    <td><%= f.contract_type %></td>
    <td><label class="label label-success" ><%= f.contract_relationship %></label></td>
    <% end %>
    <% else %>
    <td colspan="5"><center>There are currently no contracts yet.</center></td>
    <% end %>
</tr>

我有另一个运行良好的 Rails 应用程序,我遵循与搜索代码完全相同的方式,但它在这个 Rails 应用程序中不起作用。我还注意到另一个项目的日志返回了这个,效果很好。

SELECT "coworkings".* FROM "coworkings" WHERE "coworkings"."partner_id" = ? AND (title LIKE '%myspace%')  ORDER BY created_at DESC  [["partner_id", 20]]

虽然这个项目只返回这个,但另一半似乎不见了,奇怪

SELECT "contracts".* FROM "contracts" WHERE "contracts"."user_id" = ?  [["user_id", 3]]

我遵循与另一个项目完全相同的方式,但它仍然无法在此应用程序中运行。我在这两个项目中都使用了SQLite3。如果您能指出我犯的错误,将不胜感激。

【问题讨论】:

    标签: ruby-on-rails search


    【解决方案1】:

    您的.searchContract 的类方法。但是您正试图通过ActiveRecord_Rrelation 调用它。我很惊讶您没有收到未定义的方法错误。

    你想要的是一个范围:

    ## contract.rb
    scope :search, lambda { |term|
      where(["contract_name LIKE ?", "%#{term}%"])
    }
    

    然后你就可以像以前那样链接它了。

    @contracts = @current_user.contracts.search(@search).order("created_at DESC")
    

    【讨论】:

      最近更新 更多