我正在尝试通过构建一个简单的博客来学习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
答案 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