1

我是 RoR 的新手,我已经设法制作了一个基本的搜索表单,但是在尝试扩展搜索标签(名称)时不断出错。我有一个包含各种数据(位置、网站、电子邮件、电话)的模型和想知道如何将这些添加到我当前的搜索代码中。

/models/ciir.rb

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

static_pages_controller.rb

def home
  @ciirs = Ciir.search(params[:search])
end

/home.html.erb

<%= form_tag ciirs_path, :method => 'get' do %>
  <p>
    <%= text_field_tag :search, params[:search] %>
    <%= submit_tag " Search Database Records ", :name => nil %>
  </p>
<% end %>

单击提交按钮(无搜索词)时,网址为:

ciirs?utf8=✓&amp;search=

但是当将名称条件修改为“网站”之类的内容时,网址更改为

ciirs?utf8=✓&amp;search=&commit=+Search+Database+Records+ –
4

2 回答 2

6

既然你提到你是 RoR 的新手,我必须分享我学习 RoR 一次阅读、使用和分析一个问题的方式。我建议您一次看一下以下几点,并尝试了解 RoR 如何对待它们以及它们如何适合您的问题:

  1. 如何form_tag运作?

  2. 如何text_field_tag运作?

  3. 一旦你明白了,和form_tag之间的区别?text_field_tagf.text_field

  4. 对象是如何params创建的,它使用表单控件的名称?

  5. 如何以及何时使用GET和/或POST形成方法?不经意间,有哪些不同类型的方法以及何时使用它们?

  6. 它们是如何URL使用的form_tag,它们是由什么组成的?

  7. 通过s和esRuby之间的学习撒一点语言知识?事实上,尽可能多地学习。ArrayHashRuby

回答你的问题,

/home.html.erb

<%= form_tag "/static_pages/home", :method => 'post' do %>
  <p>
    <%= text_field_tag "search[name]", params.has_key?("search") && params[:search].has_key?("name") ? params[:search][:name] : "" %>
    <%= submit_tag " Search Database Records " %>
  </p>
<% end %>

/models/ciir.rb

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

所以我修改了你的表格,并告诉 RoRsearch params包含name.

params是一个Hash(它是 a key-value pair),具有名为 的键search,进一步是Hash具有名为 的键name

模型代码遵循相同的原则。我们将Hashof 键传递search给函数,并在其中使用了键名的值name

我还更新了 中的 url form_tag,将其指向控制器的 home 操作。假设您已将其添加到routes.rb文件中,它通常遵循模式controller_name/action_name或函数名称action_name_controller_name_pathaction_name_controller_name_url. 在根目录下运行rake routes命令以列出应用程序中的所有路径。

另请注意,我使用POSTmethod 而不是 original GET。您可能希望在GET这里使用,所以请改回来。

我希望这行得通。

于 2013-08-11T22:32:59.207 回答
0

我在您的代码中没有发现错误。改成的网址ciirs?utf8=✓&amp;search=&commit=+Search+Database+Records+是正常的。submit_tag默认生成一个button命名的“commit”,它会在 params 中被解析。我看到你添加 :name => nil ,它会解决问题,你的代码的另一部分不需要修改。我复制了你的代码并测试了它,它运行顺利。

于 2013-08-12T05:29:04.160 回答