2

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

谢谢

4

1 回答 1

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(我删除了部分渲染,只是将一个空 div 插入 index.erb.html 中):

<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('');

似乎当我从控制器中的创建函数中完全删除渲染 :action=>"index"时,错误消息能够显示在索引页面上。我希望不要在客户端 javascript 端进行太多处理,而在控制器端进行更多处理。还有另一种方法可以做到这一点吗?仍然想知道为什么渲染器没有渲染那个部分 html。是因为表单是 ajax 并且不会呈现整个页面吗?如果我不完全知道我在说什么,我深表歉意:)

于 2013-08-10T16:12:16.720 回答