使用render渲染模型验证错误:action => “指数”

时间:2013-08-10 02:18:19

标签: ruby-on-rails ajax validation

我正在开发一个简单的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已经渲染,但我只是看不到页面发生任何事情。我觉得我错过了一些非常明显的东西。谁知道我应该做什么?

由于

1 个答案:

答案 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并且不会呈现整个页面?如果我不知道我在说什么,我道歉:)