0

这是我第一次尝试在我的 Rails 应用程序中实现一个简单的搜索表单,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 方法,但我对此的理解还不存在,我不知道根据我输入的字符串搜索的语法,尽管我想这并不重要,因为参数是搜索字段的内容?

如果有任何帮助,那么将不胜感激

谢谢

4

1 回答 1

1

模型find方法 ( Recipe.find()) 需要实例的数字 id(特定配方)。但看起来您正在按国家/地区名称进行搜索。在 Rails中有很多方法可以做到这一点。但是,首先,我假设您的配方模型具有类似于“国家”的属性,其值类似于“威尔士”。

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

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测试 nilif @countrysearch.nil?if @countrysearch.present?
  • 很可能会有不止一个来自威尔士的食谱,所以不要期望Recipe返回的实例,而是它们的集合——在您看来,使用 <% @countrysearch.each do |recipe| 进行迭代 %> <%= recipe.name %> ... <% end %>
  • 同样,如果您使用 finder 方法,您应该使用Recipe.find_all_by_country
  • 将国家/地区名称存储在 Recipe 模型中并不是一个好习惯。创建一个包含国家的模型。
  • 您可能需要不区分大小写的搜索(“Wales”!=“wales”)
于 2012-11-08T21:11:50.390 回答