我想在我的create
操作中使用AJAX加载部分内容。从教程我知道这样做的方法是在format.js
块中单独包含行respond_to
并创建一个create.js.erb
文件。但是我的create
动作中有代码需要执行。如果我将所有这些代码放在format.js {}
块中,则部分不会被加载。我想我不确定这块里面应该包括什么?
这种作品:
def create
respond_to do |format|
format.html do
session[:user_params].deep_merge!(params[:user]) if params[:user]
@user = User.new(session[:user_params])
@user.current_step = session[:user_step]
if params[:prev_button]
@user.previous_step
elsif @user.last_step?
@user.save
else
@user.next_step
end
session[:user_step] = @user.current_step
if @user.new_record?
render :new
else
session[:user_step] = session[:user_params] = nil
flash[:success] = "Welcome to Friends First!"
redirect_to @user
end
end
format.js
end
end
我的 new.html.erb 如下所示:
<%= form_for(@user, :html => { :class => "form-horizontal" }, remote: true) do |f| %>
<%= render 'shared/error_messages' %>
<div id="partial">
<%= render "#{@user.current_step}", :f => f %>
</div>
<div class="control-group">
<div class="controls">
<%= f.submit "Previous", class: "btn btn-primary", :name => "prev_button" unless @user.first_step? %>
<%= f.submit "Next", class: "btn btn-primary" %>
</div>
</div>
但由于某些原因{I}加载部分后@user.first_step?
无效。
create.js.erb
$("#partial").html("<%= escape_javascript(render('step2')) %>");
我真正想要的是:render(@user.current_step)
答案 0 :(得分:1)
您可以完成所有逻辑,然后处理正确的格式。此外,您可以为视图使用多种格式。
There is以及来自Diaspora源代码的示例:
def create
post = current_user.find_visible_shareable_by_id(Post, params[:post_id])
@comment = current_user.comment!(post, params[:text]) if post
if @comment
respond_to do |format|
format.json{ render :json => CommentPresenter.new(@comment), :status => 201 }
format.html{ render :nothing => true, :status => 201 }
format.mobile{ render :partial => 'comment', :locals => {:post => @comment.post, :comment => @comment} }
end
else
render :nothing => true, :status => 422
end
end
如果因为用户仍然在页面上而失败,则不应该进行任何重定向。但您可能希望使用客户端验证。
因此,您可以使用format.js
作为成功案例,并使用partial重新加载部分HTML。例如:
# create.js.erb
$("#js-user-panel").html("<%= j render("users/panel", :user => @user %>");
# ... create div with flash message here and etc.
答案 1 :(得分:0)
我认为您希望在new
页面上加载部分内容,因此请执行new
操作,而不是create
。按你说的那样去做。