【问题标题】:Submit a form to a Rails route with a dynamic segment向带有动态段的 Rails 路由提交表单
【发布时间】:2012-10-28 22:33:49
【问题描述】:

我的路线看起来像

match 'solar_systems/:planet_num/:moon_num' => 'solar_system#moon', :as => :moon

我想要一个带有行星编号和月球编号选择框的表格,并让它提交到这条路线。但是我不能使用moon_path,因为如果动态参数没有像moon_path(4, 1)那样包含在其中,它会出错。我想要的甚至可能吗?如果是这样,我应该给路由的表单标签什么?

【问题讨论】:

    标签: ruby-on-rails forms routing routes


    【解决方案1】:

    你没有使用路由辅助方法,在这里你不能因为在呈现你的表单时你不知道所需的参数。但是,您确实知道控制器和操作,这实际上是目标 URL 所需的全部内容。所以这应该有效:

    = form_tag('/solar_systems/moon') do
      = select_tag(:planet_num, ...
      = select_tag(:moon_num, ...
    

    这应该呈现表单标签。要处理请求,您还必须添加另一个路由,以便调用正确的控制器操作:

    match 'solar_systems#moon' => 'solar_system#moon', :via => :post
    

    或者,如果它在您的应用程序上下文中更有意义,您可以修改现有路由以使参数可选:

    match 'solar_systems(/:planet_num(/:moon_num')) => 'solar_system#moon', :as => :moon
    

    有关非资源路由的更多详细信息,请参阅this Rails guide

    【讨论】:

    • 这不起作用,因为我没有与此匹配的任何其他路由,所以我收到错误 ActionController::RoutingError (No route matches [POST] "/solar_systems/moon"):
    • 请看我关于路线的补充。
    【解决方案2】:

    如果你在控制器上使用这个参数,你需要指定每个参数是什么,顺便说一句,在你的助手中你需要做这样的事情

    moon_path(planet_moon: 4, moon_num: 1)
    

    干杯!

    【讨论】:

    • 对,这就是我将它链接到特定值的方式。我正在尝试以未知值的形式使用它。虽然我开始相信我正在尝试做的事情在 Rails 中没有页面上的一些 JS 是不可能的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多