【问题标题】:Nested resources in namespace form_for命名空间 form_for 中的嵌套资源
【发布时间】:2011-02-12 16:01:49
【问题描述】:

问题

form_for 帮助程序错误地确定了命名空间内嵌套资源的路径。有问题的模型分别是:Forum::ThreadForum::Reply,位于我的模型目录下名为“forum”的子文件夹中。这是在 Rails 3 BETA 3 中。

routes.rb

  namespace :forum do
    root :to => 'threads#index'
    resources :threads do
      resources :replies
    end
  end

app/views/forum/replies/_form.html.haml

...
  - form_for [@thread, @reply] do |f|
...

app/controllers/forum/replies_controller.rb

...
  def new
    @reply = Forum::Reply.new
  end
...

错误

undefined method `forum_thread_forum_replies_path'

参考上面在 _form.html.haml 中概述的行

【问题讨论】:

    标签: ruby-on-rails namespaces ruby-on-rails-3 form-for


    【解决方案1】:

    上面的答案都不适合我 - 我有一个简单的类别/子类别关系,它由“媒体”命名空间包装。

    所以我有命名空间的嵌套资源

      namespace :media do
        resources :categories do
          resources :subcategories
        end
      end
    

    还有命名空间模型

    class Media::Category < ActiveRecord::Base
    end
    
    class Media::Subcategory < ActiveRecord::Base
    end
    

    最后,我在子类别的 _form 中得到了这个:

    <% theurl = @subcategory.new_record? ? media_category_subcategories_path(@category) : media_category_subcategory_path(@category,@subcategory)
       themethod = @subcategory.new_record? ? "POST" : "PATCH" %>
    <%= form_for @subcategory, url: theurl , method: themethod do |f| %>
    ...
    <% end %>
    

    【讨论】:

      【解决方案2】:

      @Douglas:这对我不起作用。在我看来,路线中的名称应该是复数形式。当我喜欢推荐时,错误是:

      undefined method `admin_admin_person_admin_image_path' for #<#<Class:0x55976d0>:0x55a9bc8>
      

      我的适用于 New 的解决方案:

      form_for @image, url: admin_person_images_path(@person, @image)
      

      我的适用于编辑的解决方案:

      form_for @image, url: admin_person_image_path(@person, @image)
      

      是否有任何解决方案可以将其组合在一个表单中?

      编辑(表单中新嵌套命名空间路由的解决方案):
      现在我在 routes.rb 中有以下逻辑

      resources :mobile_users do
       namespace :candystore do
        resource :transactions
       end
      end
      

      new_mobile_user_candystore_transactions 的形式是

      <%= form_for [@mobile_user], url: mobile_user_candystore_transactions_path(@mobile_user), method: :post do |f| %>
      

      访问 Candystore::TransactionsController 创建方法,而不是例如 MobileUser 创建方法或 Candystore::TransactionsController 更新方法。

      【讨论】:

        【解决方案3】:

        在 Rails 3 中,唯一对我有效的解决方案(对于新资源和编辑资源)是:

        form_for @image, :url => url_for([:admin, @person, @image])
        

        【讨论】:

        • 多年来,我一直在寻找可以像这样修复脚手架 _form 部分的东西!谢谢!
        • 嗯,这实际上与编写 form_for [:admin, @person, @image] 相同,因为 form_for 在内部调用 url_for。
        【解决方案4】:

        编辑解决方案以防人们不阅读反应:

        <%= form_for [:admin, @person, @image] do |f| %>
        

        旧回复:

        我有一个带有管理命名空间和 People 和 Images 资源的项目,这是我在 rails3 中构建 form_for 的方式,我还没有找到更清洁的方法...

        <%= form_for [@person, @image], :url => admin_person_images_path do |f| %>
        

        【讨论】:

        • 当然,您只需将 url 更改为更新路径。
        • 这要求我将 url 传递到我的表单部分...没什么大不了的,但似乎你不应该这样做。
        • 嗯,我又开始搞砸了,现在我有了以下工作。 form_for [:admin, @person, @image] 做 |f|
        • 您应该将此作为答案发布。
        • form_for [:admin, @person, @image] 仅在您定义未嵌套 resources :image, :only => [:show, :update] 时才有效 除了你的嵌套 namespace :admin do resources :person do resources :image end endstackoverflow.com/questions/14613306/…
        猜你喜欢
        • 2013-01-14
        • 1970-01-01
        • 2012-10-22
        • 1970-01-01
        • 2011-07-06
        • 2011-01-03
        • 1970-01-01
        相关资源
        最近更新 更多