我是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+ –
答案 0 :(得分:6)
既然你提到你是RoR的新手,我必须分享我学习RoR一次阅读,使用和分析一个问题的方式。我建议你一次看一下以下几点,然后尝试&amp;了解RoR如何对待他们以及这些问题如何适合您的问题:
form_tag
如何运作?
text_field_tag
如何运作?
了解form_tag
后,text_field_tag
和f.text_field
之间存在差异?
如何创建params
个对象,它使用表单控件的名称?
如何以及何时使用GET
和/或POST
表单方法?不经意间,有哪些不同类型的方法以及何时使用它们?
URL
如何使用form_tag
以及它们由哪些组成?
通过Ruby
和Array
之间的学习,了解Hash
语言的一些知识?事实上,尽可能多地学习Ruby
。
回答你的问题,
/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
的数据。
params
是Hash
(key-value pair
),其密钥名为search
,其中Hash
的密钥名为name
}。
模型代码遵循相同的原则。我们将密钥Hash
的{{1}}传递给了函数,并在那里使用了名为search
的密钥的值。
我还更新了name
中的网址,将其指向您控制器的主页操作。假设您已将其添加到form_tag
文件中,它通常遵循模式routes.rb
或函数名称controller_name/action_name
或action_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;无,它将解决问题,代码的其他部分不需要修改。我复制了你的代码并进行了测试,运行顺利。