ruby on rails搜索表单

时间:2013-08-11 21:56:02

标签: ruby-on-rails ruby

我是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=✓&search=

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

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

2 个答案:

答案 0 :(得分:6)

既然你提到你是RoR的新手,我必须分享我学习RoR一次阅读,使用和分析一个问题的方式。我建议你一次看一下以下几点,然后尝试&amp;了解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. 通过RubyArray之间的学习,了解Hash语言的一些知识?事实上,尽可能多地学习Ruby

  8. 回答你的问题,

    /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
    

    所以我修改了您的表单,并告诉RoR search params包含name的数据。

    paramsHashkey-value pair),其密钥名为search,其中Hash的密钥名为name }。

    模型代码遵循相同的原则。我们将密钥Hash的{​​{1}}传递给了函数,并在那里使用了名为search的密钥的值。

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

    另请注意,我使用rake routes方法而不是原始POST。您可能希望在此使用GET,因此请将其更改回来。

    我希望这有效。

答案 1 :(得分:0)

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