ruby on rails搜索表单

Jon*_*han 1 ruby ruby-on-rails

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

/models/ciir.rb

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

static_pages_controller.rb

def home
  @ciirs = Ciir.search(params[:search])
end
Run Code Online (Sandbox Code Playgroud)

/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 %>
Run Code Online (Sandbox Code Playgroud)

点击提交按钮(没有搜索字词)时,网址为:

ciirs?utf8=?&search=
Run Code Online (Sandbox Code Playgroud)

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

ciirs?utf8=?&search=&commit=+Search+Database+Records+ –
Run Code Online (Sandbox Code Playgroud)

Har*_*pta 6

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

  1. 怎么样form_tag

  2. 怎么样text_field_tag

  3. 一旦你理解了form_tag,text_field_tag和之间的区别f.text_field

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

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

  6. 如何URL使用form_tag它们和它们由哪些组成?

  7. Ruby通过学习Arrays和Hashes 来学习一些语言知识?事实上,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 %>
Run Code Online (Sandbox Code Playgroud)

/models/ciir.rb

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

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

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

模型代码遵循相同的原则.我们将Hashkey 传递search给函数,并在那里使用了key的值name.

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

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

我希望这有效.