【问题标题】:Rails 4 and simple_form for associated route关联路线的 Rails 4 和 simple_form
【发布时间】:2015-11-17 20:25:44
【问题描述】:

在我的应用中,我有 2 个模型 Foo 和 Bar。 Foo 'has_one' 酒吧和 Bar 'belongs_to' Foo。

我的路由文件如下所示:

namespace :baz do
  resources  :foo do
    resources  :bar
  end
end

我正在使用simple_form gem。因此,对于像上面提到的那样的嵌套路由,我希望以下工作:

= simple_form_for [:baz , :foo, @bar]  do |f|

当创建一个新的@bar 时,这条线工作得很好。当我尝试编辑现有的@bar 时,它会失败并显示以下错误消息:

No route matches {:action=>"show", :controller=>"baz/bar", :id=>nil, ...

我做了一些研究,似乎它与我的“form_for”参数有关。我试过把标签改成这样:

= simple_form_for [:baz , @foo, @bar]  do |f|

...我确保在我的控制器中调用@foo 的一个实例,但随后我收到一个错误,即路径不存在。

谁能帮我看看我做错了什么?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 simple-form simple-form-for


    【解决方案1】:

    使用simple_form_for,您可以使用url 属性指定表单的url。试试这个:

    = simple_form_for @bar, url: edit_baz_foo_bar_path do |f|
    

    我不确定我上面写的路径是否正确,请运行rake routes查看您的路线。

    【讨论】:

    • 谢谢@LongNguyen。我确实尝试过,它确实有效,但是它需要我有一个单独的表格来创建或编辑我的记录,我试图避免这种情况。
    • 在这种情况下,您可以检查当前操作是否更新,然后更改为正确的路径。我目前正在我的项目中这样做:)
    【解决方案2】:

    这应该可以正常工作:

    = simple_form_for [:baz , @foo, @bar]  do |f|
    

    可能你在控制器中的赋值有问题。

    如果你在 Baz::FooBarController 中有这样的东西:

    class Baz::FooBarController < ApplicationController
      def new
        @foo = Foo.find(params['foo_id'])
        @bar = @foo.bars.new
      end
    
      def edit
        @bar = Bar.find(params['id'])
        @foo = @bar.foo
      end
    end
    

    然后是这样的 new.html.slim:

    = simple_form_for [:baz , @foo, @bar]  do |f|
    

    应该产生这个html:

    <form id="new_bar" class="simple_form new_bar method="post" accept-charset="UTF-8" action="/baz/foo/1/bars" novalidate="novalidate">
    

    和等于edit.html.slim:

    = simple_form_for [:baz , @foo, @bar]  do |f|
    

    应该产生这个html:

    <form id="edit_bar_1" class="simple_form edit_bar" method="post" accept-charset="UTF-8" action="/baz/foo/1/bar/1" novalidate="novalidate">
    

    如果这对您不起作用,或者如果您决定要手动设置路径,但您仍想在新视图和编辑视图中使用相同部分的表单,您可以执行以下操作:

    = simple_form_for @bar, url: @bar.new_record? ? new_baz_foo_bars_url(foo_id: @foo.id) : edit_baz_foo_bar_url(foo_id: @foo.id, id: @bar.id) do
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多