如何在不刷新页面的情况下显示flash错误?

时间:2012-09-24 03:09:10

标签: ruby-on-rails ruby ruby-on-rails-3 forms ruby-on-rails-3.1

我有一个提交表单,显示在灯箱中。我对表单进行了大量验证,但是在某些情况下已经提交了播放列表,在这种情况下我无法在提交表单之前告知。

目前我有:disable_with => 'Submitting...'

如果将错误发送回表单,并且提交按钮将重新启用,那将非常棒。

这可以在没有太多复杂情况的情况下实现吗?

我还有第二个相关的问题...因为我的表单在灯箱中,它的代码实际上是在索引页面上(我的应用程序只是一页)。这意味着确实没有“新”操作,而是我的索引操作中的@playlist = Playlist.new(:title => ...)(以及@playlists = Playlist.all等)。在我的路线中,我这样做了:resources :playlists, :only => [:create]

这听起来跟我做的一样吗?

编辑:他是一些代码,虽然它基本上就像你想象的那样简单。

以下类型的作品......如果播放列表有效,则创建播放列表,否则无效。两次调用create.js.erb ..我现在不知道如何使这项工作完成。在成功我需要关闭窗口,失败时我需要将错误加载到已经在屏幕上的表格。我不知道那是怎么回事:/

  before_filter :load_genres, :only =>[:index, :user]
  before_filter :new_playlist, :only => [:index, :new]

  def index
    @playlists = Playlist.order('created_at DESC').page(params[:page]).per(30)
  end

  def create
    @playlist = Playlist.new(params[:playlist])
    respond_to do |format|
      if @playlist.save
        format.html { redirect_to root_path, :notice => "Playlist submitted" }
        format.js   {}
      else
        format.html { render :action => :new, :layout => !request.xhr? }
        format.js {}
      end
    end
  end

  def new

  end

  def load_genres
    @genres = Genre.order(:name)
  end

  def new_playlist
    @playlist = Playlist.new(:title => params[:title], :url => params[:url], :description => params[:description])
  end

第一个喜欢我的表单(位于index.html.erb中):

<%= form_for @playlist, :remote => true do |f| %>

我目前在create.html.erb

中没有html或代码

2 个答案:

答案 0 :(得分:1)

这是我对这个问题的解决方案....我把它们放在我所有的js.erb文件中

$('#flash').html("<%= escape_javascript raw(flash_display) %>");

有了这个助手

def flash_display
  response = ""
  flash.each do |name, msg|
    response = response + content_tag(:div, msg, :id => "flash_#{name}")
  end
  flash.discard
  response
end

这适用于已经在布局中设置的flash div

<div id="flash">
  <% flash.each do |name, msg| %>
    <%= content_tag :div, msg, :id => "flash_#{name}" %>
  <% end %>
</div>

希望这有助于

答案 1 :(得分:0)

如果没有看到您的代码,我只能提出广泛的建议。

一种是设置对控制器动作的js.erb响应 - 或者你可以在HTML中的if子句中执行js脚本标记。无论哪种方式,您都可以使用jQuery来更新元素。

在js / html erb文件中:

jQuery('#flash_area).html(<flash message>);

视图中的Flash区域需要flash_area的ID(或者您想要命名的任何内容)。

相关问题