rails 3中的搜索表单未按预期返回

时间:2012-11-08 20:31:09

标签: ruby-on-rails-3

这是我尝试在我的rails应用程序中实现一个简单的搜索表单的第一次尝试,如果我犯了一些重大错误,那么请原谅我

我有一个看起来像这样的搜索表单

  <%= form_tag({:controller => 'search', :action => 'search'}, {:method => 'get'})  do |s| %>
  <%= text_field_tag :search, params[:search] %>
   <%= submit_tag "Search" %>
  <% end %>

我的控制器

def search

@countrysearch = Recipe.find(params[:search])
end

现在我正在输出我的结果

  <h4>output</h4>
  <%= @countrysearch %>

我正在获取输出但是如果我搜索像威尔士这样的单词,我会收到一条错误,说找不到id,但是如果我搜索的是像17这样的ID,那么我得到了

  #<Recipe:0x97b0fa8> 

我已经查看了find_by_sql方法,但我对此的理解还没有,我根本没有依赖于我输入的字符串进行搜索的语法,但我想这并不重要,因为params是内容的搜索字段?

如果有任何可以帮助的话,我们将非常感激

由于

1 个答案:

答案 0 :(得分:1)

模型find方法(Recipe.find())需要实例的数字ID(特定配方)。但看起来您正在按国家/地区名称进行搜索。在Rails中有很多方法可以做到这一点。首先,我假设您的食谱模型有一个属性,如&#34; country&#34;其价值观与威尔士&#34;。

相似

如果是这样,那么你可以使用这样的搜索方法:

def search
  @countrysearch = Recipe.find_by_country(params[:search])
end

或者您也可以在Rails 3中使用新方法

def search
  @countrysearch = Recipe.where(:country => params[:search])
end

不要使用find_by_sql - 它会起作用,而且还不错,但是你却错过了Rails的一些主要功能。

还有其他一些值得一提的事情:

  • 如果搜索未返回任何结果,您将在视图中收到错误消息。在引用@countrysearch实例变量之前,请使用if @countrysearch.nil?或针对肯定案例if @countrysearch.present?
  • 测试nil
  • 威尔士会有不止一个食谱,所以期待不是Recipe的实例,而是它们的集合 - 在你的视图中,迭代使用 &lt;%@ countrysearch.each do | recipe | %GT;   &lt;%= recipe.name%&gt;   ... &lt;%end%&gt;
  • 同样,如果您使用finder方法,则应使用Recipe.find_all_by_country
  • 在配方模型中存储国家/地区名称并不是一个好习惯。创建包含国家/地区的模型。
  • 你可能想要一个不区分大小写的搜索(&#34;威尔士&#34;!=&#34;威尔士&#34;)