0

アクションでAJAXを使用してパーシャルをロードしたいと思いますcreate。チュートリアルから、これを行う方法は、ブロックに行format.jsだけを含めてファイルを作成することであることがわかります。しかし、実行する必要のあるコードがアクションに含まれています。このコードをすべてブロック内に配置すると、パーシャルはロードされません。このブロックに何を含めるべきかわからないと思いますか?respond_tocreate.js.erbcreateformat.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?しかし、パーシャルをロードすると、何らかの理由で機能しなくなります。

create.js.erb

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

私が本当に欲しいのはこれです:render(@user.current_step)

4

2 に答える 2

1

すべてのロジックを実行してから、適切なフォーマットを処理できます。さらに、ビューに複数の形式を使用できます。

ディアスポラのソースコードからの例があります:

  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 に答える