我正在尝试以我的ajax形式显示错误消息(代码基于this问题):
posts_controller.rb:
def create
@post = current_user.posts.build(params[:post])
if params[:commit] == "Publish"
@post.status = "Published"
elsif params[:commit] == "Save Draft"
@post.status = "Draft"
end
respond_to do |format|
format.html do
if @post.save && @post.status == "Published"
flash[:success] = "Post published"
redirect_to @post
elsif @post.save && @post.status == "Draft"
flash[:success] = "Post saved as draft"
render 'edit'
else
render 'new'
end
end
format.js do
@post.save
end
end
end
帖/ create.js.erb:
<% if @post.errors.any? %>
alert('There are errors.');
<%= render :partial=>'js_errors', :locals=> { :target=> @post } %>
<% else %>
$('.busy').html('Saved.');
<% end %>
js_errors.js.erb:
<% target.errors.full_messages.each do |error| %>
$('.busy').append('<p><%= escape_javascript( error ) %></p>');
<% end %>
帖/ new.html.erb:
<%= form_for(@post, remote: true, :html => { :multipart => true }) do |f| %>
<%= render 'fields', f: f %>
<div class="form-actions">
<%= f.submit "Publish", class: "publish btn btn-primary pull-left" %>
<%= f.submit "Save Draft", class: "save-draft btn btn-default pull-left" %>
<div class="busy pull-left">
</div>
</div>
<% end %>
但由于某种原因没有任何显示(.busy
始终为空)。
在控制台中我可以看到正在显示js_errors.js.erb
:
在2013-01-04 18:02:18 +0800开始发布127.0.0.1的POST / / posts 由PostsController处理#create为JS参数:{“utf8”=&gt;“✓”, “authenticity_token”=&gt; “中Qfn6HsPPDxyB1t4bM / OQKPbJ / aoAMkp74y0Z6xkoXCY =”, “post”=&gt; {“title”=&gt;“”,“content”=&gt;“”,“tag_list”=&gt;“”}, “_wysihtml5_mode”=&gt;“1”,“commit”=&gt;“保存草稿”}用户负载(0.7ms) SELECT“users”。* FROM“users”WHERE“users”。“remember_token”= 'ljl0ZsuoiHg0Jilz8bgy-g'LIMIT 1(0.2ms)开始交易
(0.2ms)回滚事务呈现的帖子/ _js_errors.js.erb (3.8ms)渲染的帖子/ create.js.erb(7.5ms)已完成200 OK 25ms(浏览次数:11.2ms | ActiveRecord:1.0ms | Solr:0.0ms)
可能是什么问题?
(如果我从表单中删除remote:true
,我会看到验证消息。)
修改
我注意到alert('There are errors.');
没有被触发。奇怪。
答案 0 :(得分:0)
它看起来像一个命名问题。您要求渲染部分 js_errors
,这将被称为_js_errors.js.erb
;但是你说你的文件实际上被称为js_errors.js.erb
(没有前导下划线)。
尝试添加下划线,看看是否有用。
答案 1 :(得分:0)
几天前我一直面临类似的问题。我在表单中使用remote => true
选项在我的Rails 3应用程序中使用Ajax。之后,我一直在寻找验证表单字段的解决方案。在尝试了大量的jQuery / Javascript方法之后(虽然它们都没有为我工作)但我开始了解一个名为client_side_validations的精湛宝石。按照github链接(https://github.com/bcardarella/client_side_validations)上的说明安装非常简单。它的工作方式就像表单字段的客户端验证一样,确实是一个很棒的宝石。希望这对那些厌倦了在Rails 3应用程序中使用Ajax后寻找模型字段的客户端验证的简单解决方案的人有所帮助。