2

我对 Rails 还是很陌生。我开始掌握它的窍门,但目前我想做的事情超出了我的范围。我做了很多研究,制作搜索框有很多,但我想简化这个过程。所以,我有一个视图助手可以做到这一点:

<% if @events.any? %>
  <ol class="events">
    <%= render @events %>
  </ol>
<% end %>

效果很好,这显示了用户自己的事件。我得到一个事件对象列表,每个对象由 3 行组成:city:event_name、 和:event_date。我想要做的是能够单击对象,一个:city或两个:city/:event_date行,并显示搜索结果,该搜索查找具有相同:cityAND的所有事件:event_date。FWIW 我正在使用下拉列表来获取事件对象的城市和日期,因此不会有用户输入差异。我想我需要继续自己渲染视图,比如

<% @events.each do |e| %>
    <%= link_to e.city, searchlinkthingie %>
<% end %>

连同一个相关的搜索控制器来获取结果并抛出一个新页面,以及一个新的路由。我还没有尝试构建控制器和路由,因为我不太清楚它需要是什么样子。我一直在阅读,link_to我想我需要继续直接建立链接,但同样,不确定它应该是什么样子。我正准备通过我的显示器把我的头。想法?

编辑:受以下答案启发的解决方案是link_to为城市和事件日期创建两个连接字符串,并search_url(params[:search1 event.city, :search2 event.date])在事件控制器中创建一个关联的搜索方法,该方法在事件模型中调用一个self.search方法,并在路线中创建一个“匹配” .rb。该模型使用 AND 执行 SQL 查询,返回我想要的结果,并使用简单的帮助程序显示。

4

1 回答 1

1

因此,您构建了搜索,以便您可以输入任意城市并取回您想要的结果。这是第一步。搜索控制器操作将接受一个参数,即搜索字符串。假设该参数被调用query

因此,您有类似 a的操作,search_controller该操作称为search,并且该操作采用 的值params[:query]来返回结果。

一旦你有了它,你就可以建立链接到预定义的搜索,如下所示:

<%= link_to e.city, search_search_path(:query => e.city) %>

此链接触发对(因此为 path )上的search操作的请求,将参数设置为。search_controllersearch_search_pathquerye.city

最后,由于此操作不适用于特定记录,因此它将是一个:collection而不是:member路由。因此,根据您的命名约定,routes.rb文件中的条目将类似于:

config.resource :search do
  get :search, :on => :collection
end

这应该会产生一个看起来像这样的 url:

http://example.com/search/search?query=chicago

where/search/search/映射到控制器search上的操作,包括参数。searchquery

您还可以输入一个匹配规则(此处显示的 Rails 3 样式),这将进一步缩短该 URL:

match "/search" => "search#search"

这将允许您拥有如下网址:

http://example.com/search?query=chicago

...这将与前面的示例相同。

于 2012-08-07T22:06:02.253 回答