1

Railscast #217 に従っています。これは、パーシャルからマルチステップ フォームを作成する方法を示しています。Ryan の指示に従い、コードを動作させましたが、Rails が AJAX を使用してパーシャルをロードするようにこれを変換する方法を考えていましたか?

users_controller.rb

class UsersController < ApplicationController
  ...
  def new
    session[:user_params] ||= {}
    @user = User.new
  end

  def create
    session[:user_params].deep_merge!(params[:user]) if params[:user]

    params.each do |key,value|
      session.deep_merge!(key=>value) if params[:user]
    end

    @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

user.rb

class User < ActiveRecord::Base
  attr_writer :current_step

  def current_step
    @current_step || steps.first
  end

  def steps
    %w[step1 step2 step3]
  end

  def next_step
    self.current_step = steps[steps.index(current_step) + 1]
  end

  def previous_step
    self.current_step = steps[steps.index(current_step) - 1]
  end

  def first_step?
    current_step == steps.first
  end

  def last_step?
    current_step == steps.last
  end
end

new.html.erb

<%= simple_form_for(@user) do |f| %>
  <%= render 'shared/error_messages' %>

  <%# render @user.current_step, :f => f %>

  <div id="form"></div>

  <div class="center">
    <%= f.submit "Previous", class: "btn btn-primary", :name => "prev_button" unless @user.first_step?  %>
    <%= f.submit "Next", class: "btn btn-primary", :name => "next_button" unless @user.last_step? %>
    <%= f.submit "Submit", class: "btn btn-primary", :name => "submit_button" if @user.last_step? %>
  </div>


<% end %>    

編集 私は私のパーシャルの1つを投稿するつもりです。変数に注意してfください - AJAX を使用してフォームからパーシャルにそれを渡す方法がわかりません。

_step1.html.erb

<div class="offset1">
  <%= f.input :first_name %>
  <%= f.input :last_name %>
  <%= f.input :email %>
  <%= f.input :password %>
  <%= f.input :password_confirmation %>  
</div>

create.js.erb

$('#form').html('<%= escape_javascript(render(@user.current_step)) %>');

これは機能しませんf。何らかの方法で渡す必要があります。

4

3 に答える 3

1

Railsアクションでは、AJAXリクエストを処理せず、ビューでそれらを開始しなかったようです..

AJAX を使用するには、次のものが必要です。

  1. クライアント側からの適切な要求。
  2. サーバー側での適切な処理。
  3. クライアント側でのサーバー応答の適切な処理。

これは簡単な ajax の例で、これはAJAX を使用したページネーションの例です。

幸運を :-)

于 2013-03-20T06:35:32.257 に答える
1

より ajax に感じさせる本当に簡単な方法は、pjax-railsを使用することです。

ほとんど何も変更する必要はありませんpjax-container。リロードされる div を定義するだけです。お役に立てれば。

于 2013-03-20T11:01:58.447 に答える