我有这样的路线:
match '/:search/:page', :to => 'search#create'
以我的形式:
<%= form_for :search, :url => {:controller => 'search', :action => 'create', :page => 1, :search => ???} do |f| %>
我需要将内容传递给:search
,但我希望它是随表单提交的值。我该怎么办?
答案 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表单可以解决它,但我想你想要“漂亮”的搜索网址。
通常有两种选择:
您无法通过简单的表单提交更改网址路径 - 只能添加参数(?x = 1&amp; y = 2 ...)。但是,当用户键入要搜索输入(onchange)或提交表单(onsubmit)的内容时,您可以通过JavaScript修改整个URL。
使用另一个将接收标准表单输入值的操作,然后将其重定向到正确的URL。例如。 /searchforward?search=Query&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