我只是在学习 Rails,如果有任何帮助,我将不胜感激。我已经看了大概 10 个教程:remote => true
,form_for
它们似乎都互相复制(同样令人困惑)。
本教程就是其中之一:http ://tech.thereq.com/post/18910961502/rails-3-using-form-remote-true-with-jquery-ujs
我的网络应用程序几乎都在一个页面上,我的“提交表单”在一个弹出式灯箱内。这意味着 form_for 代码实际上在我的 index.html.erb 中。这也意味着创建了一个新的@playlist 实例变量index
(而不是让它在new
)
我的最终目标是:
if @playlist.save
返回true
,我想将用户重定向到root_path
WITH a :notice。无需使用成功消息或类似内容更新表单。我想在保存成功时进行硬重定向。
if @playlist.save
返回false
,我想渲染 create.js.erb 中的代码,这会将错误附加到灯箱表单中而不刷新页面。note很多教程似乎都想将整个表单重新渲染为 html,然后将内容替换到位。我宁愿(如果可以的话),只需将错误发送到表单并插入它们,我认为重新渲染和替换整个表单似乎比它必须的更复杂。
截至目前,我的代码有点混乱,尤其是:
respond_to
块。这是关于这里实际发生的最大混淆点,我尝试了很多不同的代码,但没有任何效果- 我不知道 create.js.erb 是否正确
- 我没有 create.html.erb - 我认为这是正确的,因为我只想重定向
我的表格的第一行:
<%= form_for @playlist, :remote => true do |f| %>
我的整个播放列表控制器
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
创建.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);
});
});