私はちょうどRailsを学んでいるので、助けていただければ幸いです。:remote => true
on についておそらく 10 個のチュートリアルを見てきましたがform_for
、それらはすべて互いにコピーしているように見えます (同様に紛らわしいです)。
このチュートリアルはその 1 つです。
私の Web アプリはほぼすべて 1 つのページにあり、「送信フォーム」はポップアップ ライトボックス内にあります。これは、form_for コードが実際には index.html.erb 内にあることを意味します。また、新しい @playlist インスタンス変数が作成されることも意味しますindex
(これを in にする代わりにnew
)
私の最終目標はこれです:
if @playlist.save
を返します。WITH a :noticetrue
にユーザーをリダイレクトしたいと思います。root_path
成功メッセージなどでフォームを更新する必要はありません。保存成功時にハードリダイレクトが必要です。
if @playlist.save
ページを更新せずにエラーをライトボックス フォームに追加するcreate.js.erbfalse
内のコードをレンダリングします。多くのチュートリアルでは、フォーム全体を html として再レンダリングしてから、コンテンツをその場で置き換えたいと考えているようです。私は(できれば)エラーをフォームに送信して挿入したいのですが、フォーム全体を再レンダリングして置き換えるのは、必要以上に複雑に思えると思います。
今のところ、私のコードは混乱しています。特に:
respond_to
ブロック。これは、実際にここで何が起こるかについての最大の混乱点です。私は多くの異なるコードを試しましたが、何も機能しません- create.js.erb が正しいかどうかわかりません
- 私は create.html.erb を持っていません - リダイレクトしたいだけなので、これは正しいと思います
私のフォームの最初の行:
<%= form_for @playlist, :remote => true do |f| %>
私の全体の PlaylistsController
class PlaylistsController < ApplicationController
before_filter :load_genres, :only =>[:index, :user]
before_filter :new_playlist, :only => [:index, :new, :create]
def index
@playlists = Playlist.order('created_at DESC').page(params[:page]).per(30)
end
def new
end
def create
respond_to do |format|
if @playlist.save
# ???
format.html { redirect_to root_path, :notice => "Playlist submitted" }
else
# ???
format.js { render :js => @playlist.errors, :status => :unprocessable_entity }
end
end
end
def user
@playlists = Playlist.order('created_at DESC').where(:username => params[:username]).page(params[:page]).per(30)
end
def listen
playlist = Playlist.find(params[:playlist_id])
playlist.update_attribute(:listens, playlist.listens + 1)
render :nothing => true
end
private
def load_genres
@genres = Genre.order(:name)
end
def new_playlist
@playlist = Playlist.new(:title => params[:title], :url => params[:url], :description => params[:description])
end
end
create.js.erb
jQuery(function($) {
alert('createjs called');
$('#submit-form form').on('ajax:error', function(event, xhr, status, error){
var responseObject = $.parseJSON(xhr.responseText),
errors = $('<ul />');
$.each(responseObject, function(index, value){
errors.append('<li>' + value + '</li>');
})
$(this).find('.submit-playlist-errors').html(errors);
});
});