1

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

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

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

如果没有太多复杂性,这可能吗?

我还有第二个相关问题......因为我的表单在灯箱中,所以它的代码实际上在索引页面上(我的应用程序几乎只有一页)。这意味着在我的索引操作中确实没有“新”操作,而是 a @playlist = Playlist.new(:title => ...)(以及 a@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| %>

我目前没有 html 或代码create.html.erb

4

2 回答 2

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>

希望这可以帮助

于 2012-09-29T09:03:57.490 回答
0

在没有看到您的代码的情况下,我只能提出广泛的建议。

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

在 js/html erb 文件中:

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

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

于 2012-09-24T03:37:34.430 回答