【问题标题】:rails form_tag _path parametersrails form_tag _path 参数
【发布时间】:2012-10-27 01:27:15
【问题描述】:

尽管 'Passing Multiple Parameters in a 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?)

【问题讨论】:

    标签: html ruby-on-rails ruby model-view-controller haml


    【解决方案1】:

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

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

    在我看来,第二个问题相当普遍。 Rails routing system 一开始对很多人来说很难理解。我将假设,接下来,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')
    

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

    【讨论】:

    • 老兄,非常感谢!根据提供给我们班级的信息(CS169.x1@edX),当我们设置(在与此问题相关的家庭作业的第一部分)一种通过以下方式传递参数的方法时,我无法判断问题是什么像 'movies_path(:sort_by => "title")' 这样的调用...但该语句不包含在 'form_tag' HAML 元素的范围内;在这种情况下,可链接状态是有意的,所以我假设我尝试过的方法就足够了(我们只能在分配的下一部分通过“会话”传递参数)。
    • 顺便说一句,我注意到添加您提到的 routes.rb 行确实添加了一条路线...但是生成标准 CRUD 操作集的 resources :movies 行的输出受到影响输出的第一列表示“电影”与新的索引操作相关联;但是,测试表明索引路由仍然有效。 PS:我在您的帖子末尾看到一个拼写错误(“reource”),但我无法修复它,因为当我尝试时编辑屏幕需要六处更改......
    • 是的,路由按照定义的顺序进行处理(自上而下),并且会在遇到的第一个匹配项上命中。你可以有“重叠”的路线,但实际上只有第一个路线。
    【解决方案2】:

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

    hidden_field_tag 'foo', 'bar'
    

    【讨论】:

    • 这个问题的开头表明已经在现有帖子中确定了这样的解决方案(因此,没有被征求);如果在这个社区有更好的表达方式,请随时告诉我。
    • 糟糕,对不起!我没有看到你认为这是一个解决方案。
    • 不用担心;我意识到可以通过多种方式实现目标……但是在这种特殊情况下,存在一个存在问题的认识论问题,如果不了解特定的 RoR/HAML 问题,似乎很难(如果不是不可能的话)解决该问题。 ..顺便说一句,有什么想法吗?我绑定了运行调试器,实际上除了“foo”之外,人们期望在参数中传递的所有东西都在那里......
    • 我认为这与 Rails 或 HAML 无关。我刚在 Rails 外面试了一下,还是不行。网上各种声音agree。你可以安装一些 Javascript hack,但为什么要麻烦呢?
    • 是的,Brad 在他的回复的第一部分似乎已经解决了这个问题......但我不完全同意这个问题与 Rails 或 HAML 无关...... HAML是一种模板语言,而 Rails 是一种框架:因此,期望您的代码可以在幕后完成某些事情以使其正式正确(即使您指定的内容并非完全正确)并非完全不合理; Java 编译器对编写的代码执行各种优化(例如 [link]stackoverflow.com/questions/2391219/java-compiler-optimization
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多