Rails 3, комментарии во вложенной форме, неправильные маршруты? - PullRequest
1 голос
/ 31 декабря 2011

У меня есть модель Сообщений , в которой много сообщений на многих языках .Это немного нестандартно, но для иллюстрации:

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 ]

2 голосов
/ 31 декабря 2011

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

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

2 голосов
/ 31 декабря 2011

Я думаю, что вы, возможно, захотите вложить ресурсы, подобные этим, в свои 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)

...