0

我想在我的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>

但是由于某种原因@user.first_step?,一旦我加载部分内容就无法工作。

创建.js.erb

$("#partial").html("<%= escape_javascript(render('step2')) %>");

我真正想要的是:render(@user.current_step)

4

2 回答 2

1

您可以执行所有逻辑,然后处理正确的格式。此外,您可以为视图使用多种格式。

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.
于 2013-01-11T20:30:18.137 回答
0

我认为您想在new页面上加载部分内容,所以这样做是为了new采取行动,而不是create. 并按照你说的做。

于 2013-01-11T20:17:15.620 回答