Отображение представления другого контроллера при сохранении состояния - PullRequest
0 голосов
/ 10 октября 2009

У меня есть модель блога, у которой есть много комментариев к модели.

Итак, моя форма выглядит примерно так, как показано в представлении блога:

<% form_for [@blog, @comment] do |f| -%>
  <%= f.error_messages %>

  <%= f.label :message, "Add your message" %>
  <%= f.text_area :message %>

  <%= f.submit "Submit" %>
<% end -%>  

Все очень просто.

У меня есть одно действие в контроллере комментариев, и это действие создания.

def create
  @comment = Comment.new(params[:comment])

  respond_to do |format|
    if @comment.save
      flash[:success] = "Thank you for your comment"
      format.html { redirect_to :back }
    else
      format.html { render :action => "new" }
    end
  end
end

Моя проблема в том, что, когда в модели комментариев возникает ошибка проверки, я в конечном итоге создаю новый вид комментария, который не существует. Я хочу отобразить представление блога вместе с сообщениями об ошибках. Если я попытаюсь перенаправить обратно или отобразить шаблон представления блога, то комментарии пользователей будут удалены, так как состояние между ними не сохраняется. Может кто-нибудь сказать мне, что является обычным решением этой проблемы? Спасибо.

Ответы [ 2 ]

1 голос
/ 10 октября 2009

Решение состоит в том, чтобы ваш блог accept_nested_attributes_for: comments.

Изменяя комментарии только через контроллер блога, вы гарантируете, что вернетесь к просмотру блога с проверками, если что-то пойдет не так.

Изменения, которые нужно внести, чтобы он заработал.

class Blog < ActiveRecord::Base
  ...
  accepts_nested_attributes_for :comments
end

Просмотр блога / шоу

<% form_for @blog do |f| -%>
  <%= f.error_messages %>
  <% new_comments @blog.comments.select{&:new_record?} %>
  <%= f.fields_for :comments, new_comments.empty? ? @blog.comments.build : new_comments do |c| %>
  <%= c.label :message, "Add your message" %>
  <%= c.text_area :message %>
  <%=end%>

  <%= f.submit "Submit" %>
<% end -%>

Если в вашем контроллере блога нет метода обновления, вам нужно добавить его, чтобы он работал. Но я полагаю, что это не обязательно для спокойных маршрутов, поскольку рельсы предпримут совместные действия. Однако для этого также может потребоваться представление редактирования блога, практически идентичное представлению представления. Вместо этого используйте этот код в вашем контроллере.

class BlogsController < ApplicationController
  def update
    @blog = Blog.find(params[:id])
    if @blog.update_attributes(params[:blog])
      redirect_to @blog
    else
      render :action => show
    end
  end
end

Если вы используете attr_accessible для модели блога, вам необходимо добавить: комментарии к списку.

0 голосов
/ 10 октября 2009

KJF,

Вы захотите сделать что-то вроде этого:

before_filter :fetch_blog

def create
  @comment = @blog.comments.new(params[:comment])
  respond_to do |format|
    if @comment.save
      flash[:success] = "Thank you for your comment"
      format.html { redirect_to blog_path(@blog) }
    else
      format.html { render :controller => 'blog', :action => 'show' }
    end
  end
end

protected
  def fetch_blog
    @blog = Blog.find(params[:blog_id])
  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...