【问题标题】:Passing parameter to form将参数传递给表单
【发布时间】:2011-06-22 05:53:40
【问题描述】:

我有这样的路线:

match '/:search/:page', :to => 'search#create'

以我的形式:

<%= form_for :search, :url => {:controller => 'search', :action => 'create', :page => 1, :search => ???} do |f| %>

我需要向:search 传递一些东西,但我希望它是随表单提交的值。我该怎么办?

【问题讨论】:

  • 不是 100% 确定,但您是否在寻找参数 [:search]?

标签: ruby-on-rails ruby ruby-on-rails-3 forms parameters


【解决方案1】:

没有直接的方法可以做到这一点,因为必须在用户输入任何内容之前呈现带有 url(操作)的表单。所以你需要初始值,但是当你不知道用户想要输入什么时它可能没有意义。带有参数的 GET 表单可以解决它,但我想你想要“漂亮”的搜索 url。

一般有两种选择:

  1. 您不能通过简单的表单提交来更改 URL 路径 - 只能添加参数 (?x=1&y=2...)。但是,当用户键入内容以搜索输入 (onchange) 或提交表单 (onsubmit) 时,您可以通过 JavaScript 修改整个 URL。

  2. 使用另一个接收标准表单输入值的操作,然后将其重定向到正确的 url。例如。 /searchforward?search=Query&amp;page=1 应该转发到/Query/1

routes.rb:

match 'searchforward', :to => 'search#searchforward'
match '/:search/:page, :to => 'search#create', :as => :search

控制器:

def searchforward
  redirect_to search_path(params[:search],params[:page]
end

【讨论】:

    【解决方案2】:

    如果您在form_for 中设置一个值,您现在拥有它,它将是表单发送到的地址的一部分,因此您将能够通过params[:search] 在控制器中获取它。

    您还可以为用户创建一个文本字段(文本区域、选择框等)来填充值,例如described in APIDock。你甚至可以有一个隐藏的字段,它不会显示给用户,但仍然与表单一起提交。无论如何,它都可以通过params[:search] 获得。

    编辑 另一种理解您的问题的方式是,您希望根据用户键入的任何内容动态传递form_for :url 中的search 参数。在这种情况下,我可以想到三个解决方案:

    选项 1。将表单提交到独立于:search 的地方并从那里重定向:

    表格:form_for :search, :url=&gt;{:controller=&gt;"search", :action=&gt;"handle"} SearchController:

    def handle
      case params[:search] of
        when :foo then redirect_to some_path(params[:search], ...)
        when :bar then redirect_to other_path(params[:search], ...)
      end
    end
    

    缺点是不能进行 POST 重定向,只能进行 GET。优点是表格在一个地方处理。既然是 - 为什么不包括整个处理并跳过重定向?这是我会考虑的一个选择。

    选项 2。在提交之前使用一些 JavaScript 更改form HTML 元素的action 参数。

    选项 3。使用一些 JavaScript 根据之前的选择生成一个表单。

    在这种情况下,有两种形式,其中只有一种是用户可通过按钮提交的。第一个表单只包含一个下拉框(文本框、单选按钮)和一个 JavaScript 表单观察器。根据此观察者显示正确表单的值 - 请注意,在呈现表单时,用户输入的 :search 值在此时是已知的。

    当然,如果用户可用的:search 选项的选择有限,则除了第一种形式之外,您还可以使用链接集合。选项 3 在性能方面可能并不理想,但应该足够好,以便以后扩展、理解和重用它。

    不过,可能还有其他方法可以做到这一点。

    【讨论】:

    • 您如何看待 1 号工作?你能举个例子吗?
    猜你喜欢
    • 2020-04-13
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    相关资源
    最近更新 更多