3

尽管“在 form_tag 中传递多个参数”中的问题提供了一些关于如何在 form_tag 中传递参数的信息,但发布者最终决定采用不同的方法来实现上述目的(特别是使用隐藏的表单字段)。

当尝试在如下视图中使用一行代码时:

form_tag(movies_path({:foo = "bar"}), {:id => "ratings_form", :method => :get}) do

似乎 RoR 不会让控制器可以使用 'foo' 的值;在这种情况下,是否应该使用另一种语法将参数作为路径的一部分传递?

如果希望将参数作为 URL 的一部分传递,则可能会认为这种方法是正确的(事实上,生成的 HTML 表明结果<form>标签包含action="/movies?foo=bar"语句)......但控制器评估params[:foo]''和不是bar吗?)

4

2 回答 2

2

我认为这里有两个基本问题在起作用......

第一个是传递自身的实际参数。规范指定使用GET方法将表单数据集附加到 URI,使用POST方法将表单数据集包含在表单的主体中。提交表单会从表单字段生成参数,即使它是GET请求(如您指定的那样)并且已指定 URL 参数(指定的 URL 参数不是 URI 的一部分)。除非您想要“可链接”状态,例如搜索表单,否则最好坚持使用POST表单提交。

在我看来,第二个问题相当普遍。对于很多人来说, Rails 路由系统起初很难理解。我将假设,接下来,这movies_path是来自您的 routes.rb 文件中的相应resources :movies行。如果是这样,则路由未设置为在 URL 中传递信息,这将是/movies. 还将有一个movie_path设置为通过 URL 将信息传递给控制器​​。一个常见的用法是使用资源正在建模的对象类型的实例作为参数,例如movie_path(@movie). 这种类型的用法将to_params在传入的对象上运行,默认情况下返回对象的 id(但可以很容易地覆盖)。这导致params[:id]在控制器中可用。如果您只想发送不受资源支持的任意信息作为 URL 的一部分,以便在控制器中可用,您可能只想定义一个自定义路由来执行此操作,如下所示:

match '/movies/:foo' => 'movies#index', :as => :movies

当像这样使用时,它将params[:foo] == 'bar'在控制器中生成:

movies_path('bar')

无论如何,希望这会有所帮助,祝你好运。

于 2012-11-08T04:38:35.593 回答
0

你不能只添加一个隐藏字段吗?

hidden_field_tag 'foo', 'bar'
于 2012-11-07T01:46:55.373 回答