命名空间form_for中的嵌套资源

时间:2010-04-27 00:56:23

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

问题

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

的routes.rb

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

应用/视图/论坛/回复/ _form.html.haml

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

应用/控制器/论坛/ replies_controller.rb

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

错误

undefined method `forum_thread_forum_replies_path'

参考上面_form.html.haml

中概述的行

4 个答案:

答案 0 :(得分:46)

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

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

旧回复:

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

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

答案 1 :(得分:2)

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

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

我的新解决方案:

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更新方法。

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

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

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

  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 %>