我有一个帖子模型,其中包含许多语言的帖子。这有点不标准,但要说明:
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>
感谢。
答案 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| %>
优点是您可以使用完全相同的表单来编辑评论(即使评论无法在您的应用中编辑,我认为这是一个很好的做法)。