将参数传递给表单

时间:2011-06-22 05:53:40

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

我有这样的路线:

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

以我的形式:

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

我需要将内容传递给:search,但我希望它是随表单提交的值。我该怎么办?

2 个答案:

答案 0 :(得分:0)

如果您在form_for中设置了一个值,现在它已经存在,它将成为表单发送到的地址的一部分,因此您可以通过{{1}在控制器中获取它}。

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

修改了解问题的另一种方法是,您希望params[:search]中的search参数根据输入的用户动态传递。在这种情况下,我可以想到三个解决方案:

选项1 。将表单提交到独立于form_for :url的某个位置并从那里重定向:

表格::search form_for :search, :url=>{:controller=>"search", :action=>"handle"}

SearchController

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

选项2 。在提交之前,使用一些JavaScript来更改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 HTML元素的action参数。

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

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

当然,如果用户可用的:search选项的选择有限,则可以使用第一个表单的insead。选项3在性能方面可能并不理想,但应该足够好以便以后扩展,理解和重用它。

但可能还有其他一些方法可以做到这一点。

答案 1 :(得分:0)

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

通常有两种选择:

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

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

  3. 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