0

我正在使用 Rails 3、mac os 山狮和 Ruby 1.9.3

所以我有这个对象叫做object1。我为它构建了一个搜索功能,它可以正常工作:

def self.search(search)
  search_condition = "%" + search + "%"
  if search
    find(:all, :conditions => ['name LIKE ?', search_condition])
  else
    find(:all)
  end
end

现在我想在object2中使用它。所以在object2控制器中我写道:

def search
  @results = Object1.search(params[:search])
end

在视图中:

= form_tag object2_path, :method => 'get' do
  #{text_field_tag :search, params[:search], :id => 'search_field'}
  #{submit_tag "Search", :name => nil}

- for result in @results
  %li
    = result.name

但由于某种原因,@results 返回 nil。我在做什么有什么问题?非常感谢。

4

3 回答 3

0

您进行搜索的代码是正确的,这不是问题。在您看来,您写道:

= form_tag object2_path, :method => 'get' do

除非您采取特殊措施,否则这将影响index您的 object2-controller 的方法。因此,您可以通过将索引方法更改为搜索是否已params[:search]定义来解决此问题。

或者更改表单的路径以转到搜索路径并确保它呈现正确的视图。

HTH。

于 2013-02-22T15:21:30.177 回答
0

您是否确定在 routes.rb 中定义了搜索方法?如果您不这样做,它将默认为 show 操作,并且可能未设置 @search。

您可能还想更改表单的 URL:

form_tag object2_path, :method => 'get' do

form_tag search_object2_path, :method => 'get' do

您的控制器代码对我来说看起来不错。

于 2013-02-26T07:47:25.220 回答
-1

始终将通用代码放在应用程序助手中;

应用助手:

module ApplicationHelper
  def search(search)
    search_condition = "%" + search + "%"
      if search
        find(:all, :conditions => ['name LIKE ?', search_condition])
      else
        find(:all)
      end
  end
end

现在您可以从控制器中调用该方法,例如:

search(params[:search])

如果您想确定如何从控制器调用辅助方法,请查看SO 帖子。

于 2013-02-22T10:18:29.047 回答