我正在使用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返回零。我正在做什么有什么问题?非常感谢。
答案 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。