Rails 3,嵌套表单中的注释,错误的路由?

时间:2011-12-31 12:06:23

标签: ruby-on-rails forms routes nested has-one

我有一个帖子模型,其中包含许多语言的帖子。这有点不标准,但要说明:

class Post < ActiveRecord::Base
  has_one :eng_post, :dependent => :destroy         # <-- HAS_ONE!
  accepts_nested_attributes_for :eng_post, :allow_destroy => true
end

即。一个帖子有一个EngPost。而EngPost在模型中定义为:

class EngPost < ActiveRecord::Base
  belongs_to :post
  has_many :eng_comments, :dependent => :destroy
  accepts_nested_attributes_for :eng_comments, :allow_destroy => true
  attr_accessible :eng_comments_attributes
end

最后,eng_comments模型是:

class EngComment < ActiveRecord::Base
  belongs_to :eng_post, :foreign_key => "eng_post_id"
end

routes.rb定义:

resources :posts do
  resource :eng_posts
end

resource :eng_post do
  resources :eng_comments
end

resources :eng_comments

问题 - 无法使用发布eng_comments帖子,我试过了:

<% form_for ([@post, @post.eng_post, @post.eng_post.eng_comments.build]) do |f| %>

并尝试:

<% form_for @comment do |f| %>

这会导致错误

undefined method `post_eng_post_eng_comments_path' for #<#<Class:0x000000067de2a8>:0x000000067c4498>

感谢。

2 个答案:

答案 0 :(得分:2)

我认为您可能希望在routes.rb

中嵌套这样的资源
resources :posts do
  resource :eng_posts do 
    resource :eng_comments
  end
end

这应该给你这样的路径:/posts/:id/eng_posts/:id/eng_comments/[:id]

那样post_eng_post_eng_comments_path应该存在..(最好用rake routes试一试)

答案 1 :(得分:2)

eng_comments也需要嵌套:

resources :posts do
   resource :eng_post do #no 's'
       resources :eng_comments
   end
end

resources :eng_posts do
     resources :eng_comments
end

resources :eng_comments

如果您正在使用
<% form_for ([@post.eng_post, @post.eng_post.eng_comments.build]) do |f| %> 然后你当前的路线会起作用。


PS:
您可能希望准备控制器中的所有变量(尤其是eng_comment):

def new
    @post = Post.find...
    @eng_comment = @post.eng_post.eng_comments.build
end

这样你就可以:

<% form_for ([@post, @post.eng_post, @eng_comment]) do |f| %>

优点是您可以使用完全相同的表单来编辑评论(即使评论无法在您的应用中编辑,我认为这是一个很好的做法)。