【问题标题】:How to display flash error without refreshing page?如何在不刷新页面的情况下显示 flash 错误?
【发布时间】:2012-09-24 03:09:09
【问题描述】:

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

目前我有: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或代码

【问题讨论】:

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


    【解决方案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>
    

    希望对你有帮助

    【讨论】:

      【解决方案2】:

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

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

      js/html erb文件内:

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

      视图中的 flash 区域需要flash_area 的 id(或任何您想命名的名称)。

      【讨论】:

        猜你喜欢
        • 2012-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-25
        • 2017-12-21
        相关资源
        最近更新 更多