Ruby on rails 呈现另一个控制器';保持状态时的视图
我有一个博客模型,有很多模型评论关系 因此,我的表单在blog show视图中看起来像这样: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" %> &
<% 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