Перенаправление на другой контроллер в Rails

Я пытаюсь перенаправить с одного контроллера на другой в Rails и получаю эту ошибку:

неопределенный метод `вызов' для nil:NilClass

Код довольно прост (в методе def create):

@blog_post_comment = BlogPostComment.new(params[:blog_post_comment])

respond_to do |format|
  if @blog_post_comment.save
    flash[:notice] = 'Comment was successfully created.'
    redirect_to(@blog_post_comment.blog_post)
  else
    render :action => "new"
  end
end

Сохранение проходит нормально, значение попадает в базу. Как я могу обойти ошибку перенаправления?

Форма:

<% form_for @blog_post_comment do |f| %>
    <%= f.hidden_field :blog_post_id %>
...

ОБНОВЛЕНИЕ:

После некоторого расследования выяснилось, что проблема была в линии respond_to do |format| в контроллере blog_post_comment. Как только я удалил его, теперь все в порядке.


person Vitaly    schedule 13.04.2010    source источник
comment
молодец, решил свою проблему! +1   -  person Yuval Karmi    schedule 20.04.2010


Ответы (1)


Предполагая, что у вас есть ассоциация, вы можете найти свой комментарий следующим образом:

@blog_post = BlogPost.find(params[:blog_post_id])
@blog_post_comment = @blog_post.comments.build(params[:blog_post_comment])

А потом

respond_to do |format|
  if @blog_post_comment.save
    flash[:notice] = 'Comment was successfully created.'
    redirect_to(@blog_post)
  else
    render :action => "new"
  end
end

Если у вас нет ассоциации, вот как ее настроить:

В вашей модели BlogPost у вас должна быть следующая строка:

has_many :blog_post_comments

И в вашей модели BlogPostComment вы должны иметь:

belongs_to :blog_post

В route.rb у вас должно быть:

map.resources :blog_post_comment, :has_many => 'blog_post_comments'
person Yuval Karmi    schedule 13.04.2010
comment
Хм, не уверен, что я получаю синтаксис @blog_post.build - как он узнает, что это комментарий, который нужно построить? - person Vitaly; 13.04.2010
comment
Должно быть @blog_post.comments.build(...) Я думаю. - person Tilendor; 13.04.2010
comment
Хорошо понял. Он показывает ошибку, что не может найти BlogPost по идентификатору, я думаю, это связано с тем, что blog_post_id является внутренним параметром blog_post_comment. Из запроса: blog_post_comment=›{body=›qweqwe, blog_post_id=›1}. Как мне это получить? - person Vitaly; 13.04.2010
comment
Это будет передано через хэш параметров, поэтому вы можете сделать params['blog_post_comment']['blog_post_id'], хотя что-то подсказывает мне, что есть более простой способ сделать это... Дайте мне знать, если это сработает для вас. - person Yuval Karmi; 14.04.2010