Rails中的format.js vs format.html

时间:2013-01-11 20:09:59

标签: ajax ruby-on-rails-3 jquery

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

2 个答案:

答案 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。按你说的那样去做。