【问题标题】:Passing data from a form through a query string in Rails通过 Rails 中的查询字符串从表单传递数据
【发布时间】:2011-03-19 02:43:44
【问题描述】:

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

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

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

:query => params[name_of_search_form_element]

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

【问题讨论】:

    标签: ruby-on-rails forms routing query-string


    【解决方案1】:

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

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

      map.search 'search', :controller => 'search', :action => 'search'
    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 -%>
    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
    4. 剩下的就是在“view/sea​​rch/”下创建“search.html.erb”文件,并在@users 变量中显示每个用户。

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

    【讨论】:

    • 添加命名路由解决了我在查询字符串中将方法作为参数传递的问题。感谢您的帮助!
    【解决方案2】:

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

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

    使用表单,我相信设置:method =&gt; :get 可以解决问题。请看本页第 1.1 节:http://guides.rubyonrails.org/form_helpers.html

    【讨论】:

    • 我试过这个,不幸的是,我得到的 URL 是:www.mydomain.com/search?method=get 所以它看起来像是传递 :method 作为参数。可能是我的路线有问题,还是默认路线有问题?
    • 啊哈,由于某种原因,在表单标记中指定控制器和操作而不是使用命名路由导致方法在查询字符串中传递。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多