2016-09-26 111 views
0

我可以在我的控制台看到,我做的erorr_messages部分是呈现,如果一个评论没有通过验证,那么它不会被张贴,但我不能得到实际要呈现的错误内容。Rails:错误消息部分不呈现

错误部分:

<% if object.errors.any? %> 
<div id="error_explanation"> 
    <div class="alert alert-danger"> 
     The form contains <%= pluralize(object.errors.count, "error") %> 
    </div> 
    <ul> 
    <% object.errors.full_messages.each do |msg| %> 
     <li><%= msg %></li> 
    <% end %> 
    </ul> 
    </div> 
<% end %> 

评论形式

<%= form_for @comment, url: comments_path do |f| %> 
<%= render 'shared/error_messages', object: f.object %> 
<%= f.hidden_field :user_id, value: current_user.id %> 
<%= f.hidden_field :post_id, value: post.id %> 
<%= f.text_area :content, size: "60x2", placeholder: "Comment on this post..." %> 
<%= f.submit "Comment" %> 

POST表单

<%= form_for [@user, @post] do |f| %> 
<%= render 'shared/error_messages', object: f.object %> 
<%= f.text_area :content, size: "60x12", placeholder: "What do you want to say?" %> 
<%= f.submit "Post" %> 

用户/节目

<% if @user == current_user %> 
<h4>Welcome <%= current_user.email %>! </h4> 
<%= render "notifications" %> 
<%= render 'shared/post_form' %> 
<%= render 'feed' %> 
<% end %> 

class CommentsController < ApplicationController 
def index 
    @comments = Comment.all 
end 

def new 
    @comment = Comment.new 
    @user = User.find(params[:user_id]) 
end 

def create 
    @user = current_user 
    @comment = @user.comments.build(comment_params) 

    if @comment.save 
     flash[:success] = "Comment Posted!" 
     redirect_back(fallback_location: root_path) 
    else 
     flash[:danger] = "Could not post comment" 
     redirect_back(fallback_location: root_path) 
    end 
end 


private 

def comment_params 
    params.require(:comment).permit(:content, :user_id, :post_id) 
end 
end 

class PostsController < ApplicationController 

def index 
    @posts = Post.all 
    @user = User.find(params[:user_id]) 
    @comment = Comment.new 
end 

def new 
    @post = Post.new 
    @user = User.find(params[:user_id]) 
end 

def create 
    @post = current_user.posts.build(post_params) 
    if @post.save 
     flash[:success] = "Posted!" 
     redirect_to user_path(current_user) 
    else 
     flash[:danger] = "Post could not be submitted" 
     redirect_to users_path 
    end 
end 

private 

def post_params 
    params.require(:post).permit(:content) 
end 
end 
+0

你是否检查过你的偏好文件名,它应该是'_error_messages'并且位于'app/views/shared'? – araratan

+0

是的,我已经将它命名为,并且它也位于该位置。 –

回答

1

在你CommentsController#create,当保存失败,而不是重定向:

redirect_back(fallback_location: root_path) 

尝试停留在同一个页面上,只是呈现了“新”的模板:

render action: "new" 

如果您重定向,浏览器会进行第二次请求和@comment将被覆盖用新建造的评论。

如果您保持在同一页面上并呈现“新”模板,它将使用已加载且未能保存的实例(此实例上设置了所有验证错误)@comment

P.S.因为这就是flash的作用 - 这是一种在会话中存储消息的方式,以便它们可以在重定向中存活。

+0

唯一的问题是,我没有用于new.html.erb的模板,因为我刚刚使用了_comments_form.html。 erb部分 –

+0

啊,呃!在这种情况下,最简单的选择是将验证错误消息放入flash中:'flash [:danger] =“无法发表评论:#{@comment.errors.full_messages}”。更复杂的选择是使用[jquery_ujs](https://github.com/rails/jquery-ujs/wiki)和[rails'data:remote forms](http://guides.rubyonrails.org/working_with_javascript_in_rails。 html) – gmcnaughton

+0

摇滚男人的好主意把它放在闪存中!谢谢你的帮助! –