Rails:对博客评论无效的验证

时间:2015-08-21 14:05:54

标签: ruby-on-rails ruby-on-rails-4

我正在尝试通过构建一个简单的博客来学习Rails。我已经可以使用AJAX添加注释了我现在正在尝试验证注释中是否存在名称和正文。但是,验证无效。当没有错误时,评论会像它应该添加一样,但是当我将“名称”或“正文”留空并尝试添加评论时,我会被重定向到我试图发布的这个奇怪的平面HTML版本的帖子评论(有这样的路径:/ posts / 21 / comments)。我不明白为什么会发生这种情况,而不仅仅是帖子页面重新出现并带有错误信息,我会非常感谢任何可以帮助我的人。

所以这里是CommentsController:

class CommentsController < ApplicationController

    def create
        @post = Post.find(params[:post_id])
        @comment = @post.comments.create(comment_params)
        if @comment.errors.any?
            respond_to do |format|
                format.html { render @post }
                format.js
            end
        else
            respond_to do |format|
                format.html { redirect_to @post }
                format.js
            end
        end
    end

    def destroy
        @post = Post.find(params[:post_id])
        @comment = Comment.find(params[:id])
        @comment.destroy

        respond_to do |format|
            format.html { redirect_to @post }
            format.js
        end
    end

    private

    def comment_params
        params.require(:comment).permit(:name, :body)
    end
end

型号:

class Comment < ActiveRecord::Base
  belongs_to :post

  validates_presence_of :body, :name
end

评论show.html.erb的一部分:

<section id="comment-section">
  <div id="comments">
    <h2>Reacties</h2>
    <%= render partial: @post.comments.reverse %>
  </div>

  <%= form_for [@post, Comment.new], remote: true, authenticity_token: true do |f| %>
    <% if @comment && @comment.errors.any? %>
      <% @comment.errors.full_messages.each do |msg| %>
       <li><%= msg %></li>
      <% end %>
    <% end %>
    <p>
      <%= f.label :name, "Naam" %><br/>
      <%= f.text_field :name %></br></br>

      <%= f.label :body, "Reactie" %><br/>
      <%= f.text_area :body %>
    </p>
    <p><%= f.submit "Verstuur" %></p>
  <% end %>
</section>

_comment.html.erb partial:

<%= div_for comment do %>
  <p>
    <strong>
      Posted <%= time_ago_in_words(comment.created_at) %> ago
    </strong>
    <br/>
    <i><%= comment.name %>:</i>
    <%= comment.body %>
  </p>
  <p>
    <% if logged_in? %>
      <%= button_to 'Delete', [comment.post, comment],
               :method => :delete,
               :class=> 'link-button',
               remote: true,
               data: { confirm: 'Are you sure?' }
                %>
    <% end %>

  </p>
<% end %>

最后,我的routes.rb文件:

Rails.application.routes.draw do
  get 'static_pages/aboutme'
  get 'static_pages/photos'

  get 'sessions/new'

  resources :posts do
    resources :comments, only: [:create, :destroy]
  end

  get    'admin'   => 'sessions#new'
  post   'admin'   => 'sessions#create'
  delete 'logout'  => 'sessions#destroy'

  get '/overmij' => 'static_pages#aboutme'
  get '/fotos' => 'static_pages#photos'

  root 'posts#index'
end

2 个答案:

答案 0 :(得分:0)

通常我使用flash来显示我的错误信息,这样的事情应该可行

控制器

respond_to do |format|
 format.html { flash[:notice] = @comment.errors, render @post }
 format.js
end

查看

<%if notice.present? %>
 <div class="alert alert-danger" role="alert">
   <% notice.each do |msg| %>
   <li><%= msg %></li>
  <% end %>
 </div>
<% end %>

答案 1 :(得分:0)

错误在此行format.html { render @post }该行呈现comments.index,因为它们在帖子中嵌套,因此您获得post/:id/comments。如果你想渲染一个视图(来自另一个控制器),你必须这样做:

render template "posts/show"

或只是

render "posts/show"

但是关于渲染视图/模板的事情是它不会设置所需的任何变量,因此您会收到类似@variable is nil的错误,因此您需要设置post / show所需的变量。你可以做的另一件事是redirect_to @post,但关于重定向的事情是它会刷新页面并删除用户在文本框中输入的内容。

这些是渲染/重定向

上的rails docs