Ruby on rails 呈现另一个控制器';保持状态时的视图

Ruby on rails 呈现另一个控制器';保持状态时的视图,ruby-on-rails,Ruby On Rails,我有一个博客模型,有很多模型评论关系 因此,我的表单在blog show视图中看起来像这样: <% form_for [@blog, @comment] do |f| -%> <%= f.error_messages %> <%= f.label :message, "Add your message" %> <%= f.text_area :message %> <%= f.submit "Submit" %> &

我有一个博客模型,有很多模型评论关系

因此,我的表单在blog show视图中看起来像这样:

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

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

  <%= f.submit "Submit" %>
<% end -%>  
我的问题是,当注释模型中发生验证错误时,我将最终呈现不存在的新注释视图。 我想呈现blog show视图以及错误消息。 如果我尝试重定向回或呈现博客显示视图模板,那么用户的评论最终将被删除,因为它们之间的状态没有保留。 谁能告诉我这个问题的常规解决方案是什么?谢谢。

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

解决方案是让你的博客接受注释的嵌套属性

仅通过博客控制器修改评论,您将确保在出现问题时返回到带有验证的博客视图

您需要进行更改才能使其正常工作

class Blog < ActiveRecord::Base
  ...
  accepts_nested_attributes_for :comments
end
classblog
博客/展示视图

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

如果你的博客控制器中没有更新方法,你需要添加一个使其工作的插件。但是我相信这对于restful路由是不必要的,因为rails将采取共同的行动。但是,这也可能要求您拥有与show视图几乎相同的博客编辑视图。而是在控制器中使用此代码

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
class BlogsControllershow
结束
结束
结束

如果您在博客模型中使用attr_accessible,则必须将:comments添加到列表中。

谢谢,我已经尝试过这种方法,但我遇到的问题是,它现在呈现路径Blog/1/comments,其中1是博客文章的id。
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