在rails中使用不同控制器中的对象

时间:2013-02-22 09:52:26

标签: ruby-on-rails ruby-on-rails-3

我正在使用Rails 3,mac os mountain lion和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返回零。我正在做什么有什么问题?非常感谢。

3 个答案:

答案 0 :(得分:0)

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

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

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

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

HTH。

答案 1 :(得分:0)

您是否确定在routes.rb中定义了搜索方法? 如果你没有,它将默认为show动作,并且可能没有设置@search。

您可能还想更改表单的网址:

form_tag object2_path, :method => 'get' do

form_tag search_object2_path, :method => 'get' do

您的控制器代码对我来说很好。

答案 2 :(得分:-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])

如果你想确定如何从控制器调用辅助方法,请检查this SO post。