2011-12-31 2 views
1

У меня есть Должности модель, которая имеет много сообщений на многих Языки. Это немного нестандартное, но для иллюстрации:Rails 3, комментарии во вложенной форме, неправильные маршруты?

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

I.e. Почта имеет один 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

в 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| %> , то ваши текущие маршруты будут работать.


пс:
вы можете подготовить все переменные в контроллере (особенно 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| %> 

Преимущество заключается в том, что вы сможете использовать ту же форму для редактирования комментария (даже если комментарии не могут быть отредактированы в вашем приложении, я думаю, что это хорошая практика).

+0

Робин, спасибо за ваш ответ. Но единственный способ сделать это - это <% form_for ([@post, @ post.eng_post, @ post.eng_post.eng_comments.build]) do | f | %>. Тем не менее форма комментариев не отображается, а вывод отладки ---! Ruby/object: EngComment атрибуты: id: !!нуль eng_post_id: 97 full_name: !! нуль сайт: !! пустой электронная почта: !! нулевой комментарий: !! пустой created_at: !! нуль updated_at: !! нулевой – valk

+0

К сожалению, ваше предложение работает, после добавления Ресурсы: eng_posts do Ресурсы: eng_comments end – valk

+0

Я также редактировал свое сообщение, чтобы дать вам предложение по вашей форме. – Robin

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)

+0

Тигрень, благодарю вас за подсказку маршрутов рейка! – valk

Смежные вопросы