我正在开发一个简单的YouTube列表应用,用户可以将视频添加到列表中。我正在验证video_id字段的存在。
class Track < ActiveRecord::Base
attr_accessible :title, :thumbnail_url, :video_id
validates :video_id, :presence => true
end
我在控制器中定义了以下创建函数:
def create
#fetches the video info, stores it in @trackinfo
if is_url(params[:track][:query])
@trackinfo = getTrackInfo(params[:track][:query])
else
@trackinfo = youTubeQuery(params[:track][:query])
end
#use @trackinfo to create track object
@track = Track.new(@trackinfo)
@tracks = Track.all
@video_ids = Track.pluck(:video_id)
if @track.save
else
render :action=>"index"
end
端
在我的index.erb.html中我有以下块:
<%= render partial: "error_message" %>
相应的_error_message.erb.html只包含验证中的错误消息:
<% if @track.errors.any? %>
<% @track.errors.full_messages.each do |msg| %>
<%= msg %><br>
<% end %>
<% end %>
问题是当验证失败时,我无法从渲染视图中看到错误消息。我在消息进入渲染索引之前记录了消息,并且能够看到消息:
来自控制器:
if @track.save
else
puts "#{@track.errors.full_messages}" #i am able to see this
render :action=>"index"
end
我不知道渲染过程中会发生什么导致错误消息不显示,在服务器日志上它确实说_error_messages.erb.html已经渲染,但我只是看不到页面发生任何事情。我觉得我错过了一些非常明显的东西。谁知道我应该做什么?
由于
答案 0 :(得分:1)
我想我已经解决了这个问题,但我不确定我的修复是否合适。我忘了在主index.erb.html上提到我有一个搜索栏和一个嵌入在ajax表单中的提交按钮,它调用控制器内的create函数
<%= form_tag(@track, :remote=>true, :method => :post, :class => 'new_track') do %>
<%= text_field_tag "track_query", nil, :placeholder => 'enter a query or a link', :id => "search_bar", :name => "track[query]", :size => 30, :required => true %>
<%= submit_tag "add" , :name => 'commit'%>
</p>
<% end %>
我现在也在同一页面中有错误div(我删除了渲染部分,只是在index.erb.html中填充了一个空div):
<div id = "error_message">
</div>
在 create.js.erb 文件中,我添加了以下几行:
<% elsif @track.errors.any? %>
if($.trim($("#error_message").html())==''){
<% @track.errors.full_messages.each do |msg| %>
$('#error_message').hide().append('<%= msg %>');
<% end %>
$('#error_message').fadeIn();
}
$('#search_bar').val('');
似乎当我从控制器中的create function中完全删除 render:action =&gt;“index”时,错误消息能够显示在索引页面上。我希望不要在客户端javascript方面进行太多处理,而在控制器方面则更多。还有另一种方法吗?仍然想知道为什么渲染没有渲染部分HTML。是因为表单是ajax并且不会呈现整个页面?如果我不知道我在说什么,我道歉:)