通过 Rails 中的查询字符串从表单传递数据

rym*_*odi 5 forms routing ruby-on-rails query-string

我正在创建一个具有搜索功能的应用程序,我希望它的设置类似于 Google 或 Twitter 搜索,其中在根 URL 处有一个带有搜索表单的登录页面,然后通过查询传递来自该表单的数据字符串,它构成了结果页面的 URL(例如:www.domain.com/search?query=my+search+query)。

到目前为止,我知道如何通过使用 params 哈希的搜索传递数据,但我想知道如何传递数据并使用查询字符串访问它。

我最好的猜测是它是通过路由完成的,您在路由中包含以下内容以进行搜索操作:

:query => params[name_of_search_form_element]
Run Code Online (Sandbox Code Playgroud)

然后使用 params 哈希在控制器中访问这个值,但我不确定这是否是最好的方法。有什么想法吗?谢谢!

小智 7

我建议使用以下程序来设置简单搜索。

  1. 在您的“routes.rb”文件中创建搜索路线。这允许您拦截所有以 'search' 开头的路径调用,例如http://www.example.com/search

    map.search 'search', :controller => 'search', :action => 'search'
    Run Code Online (Sandbox Code Playgroud)
  2. 在视图中创建常规搜索表单,如下例所示。

    您可以看到search_url由您的路由配置提供的辅助方法。此帮助程序创建一个直接指向您映射的搜索页面的 url。您还应该注意到:method => 'get'调用,它将显示您的所有发送参数作为 url 的一部分。此外,我们不想在 url 中发送搜索按钮的名称,因此我们设置了:name => nil. 我们还将在文本字段中显示当前搜索的术语。用户输入的搜索参数将在控制器中提供给我们,通过params[:search]它是搜索字段的名称。

    <%- form_tag(search_url, {:method => 'get'}) do -%>
        <%= text_field_tag(:search, params[:search]) >
        <%= submit_tag('Search', :name => nil) >
    <%- end -%>
    Run Code Online (Sandbox Code Playgroud)
  3. 现在我们可以设置搜索控制器。

    如您所见,如果我们找到搜索参数,我们将尝试通过该名称查找用户。如果我们没有搜索参数,所有用户都将显示在结果视图中。

    class SearchController
      def search
        if params[:search].present?
          @users = User.find(:all, :conditions => ['name LIKE ?', params[:search]]))
        else
          @users = User.find(:all)
        end
      end
    end
    Run Code Online (Sandbox Code Playgroud)
  4. 您剩下的就是在“view/sea​​rch/”下创建“search.html.erb”文件并在@users 变量中显示每个用户。

如果我没有忘记某些东西,您现在应该可以设置一个简单的搜索表单。祝搜索顺利!


Kar*_*arl 1

使用超链接很容易做到这一点:

link_to "Page", :controller => :stuffs, :action => :index, :my_param => 'foo'
link_to "Page", @thing.merge({:my_param => 'foo'})
Run Code Online (Sandbox Code Playgroud)

有了表格,我相信设置:method => :get就能解决问题。查看本页第 1.1 节:http://guides.rubyonrails.org/form_helpers.html