1

jsでウィザードを作りたいです。

steps   :first_step,
        :second_step

私の「controller_step」で

def show
        case step
            when :first_step
                @r  = R.new
            when :second_step

            end
        render_wizard
end

def update
        case step
            when :first_step
                @r = R.new(r_params)
            when :second_step

            end

        render_wizard @r
end

最初のステップの更新後に問題が発生しました。次のエラー メッセージが表示されます。

「{:locale=>[:en]、:formats=>[:html]、:variants=>[]、:handlers=>[:erb、:builder、:raw のテンプレート controller_step/second_step、application/second_step がありません」 , :ruby, :coffee, :jbuilder]}. ".

jsテンプレートを強制的にロードするにはどうすればよいですか? 「second_step.js.erb」をロードします。

更新方法を変更しようとしました:

respond_to do |format|
  format.js { render :js => ( render_wizard @r ) }  
end

もちろん、次のエラーが表示されます。

"AbstractController::DoubleRenderError in ...Controller#update Render および/または redirect が、このアクションで複数回呼び出されました。render または redirect のみを呼び出すことができ、アクションごとに最大 1 回であることに注意してください。また、redirect も render もどちらも呼び出さないことに注意してください。アクションの実行を終了するので、リダイレクト後にアクションを終了したい場合は、「redirect_to(...) と return」のようなことをする必要があります。

また、コードを変更しようとしました(更新中):

respond_to do |format|
   format.js { render :js => ( render_wizard @room_types and return ) } 
end

同じエラーが発生します ( ... application/second_step with {:locale=>[:en], :formats=>[:html] .... )

PS

最初のステップを考慮して:

<%= form_for(@r, url: wizard_path, method: :put, remote: true) do |f| %>
   ....
   <%= f.submit "Submit", class: "btn btn-default" %>
<% end %>

どうすれば修正できますか? 前もって感謝します

4

2 に答える 2

1

私はこのように解決しました:

Rモデルで:

validates   :x, presence: true

ステップコントローラーで:

...
steps   :first_step,
        :second_step,
        :finish_step
...

def show
    case step
        when :first_step
            @room_types  = R.new
        end

    render_wizard       
end

def update
   case step
      when :view_new_room_type_step
         @r = R.create(r_params)
      when :view_desc_step
         @r = R.find(params[:r][:id])
         @r.update(r_params)
      end

    respond_to do |format|
       if !@r.errors.any?
          format.js { !next_step?(:finish_step) ? ( render next_wizard_path ) : ( redirect_to_finish_wizard ) }
       else
          format.js { render wizard_path, r: @r }
       end
    end
end 

private
        ...

        def redirect_to_finish_wizard
            redirect_to r_index_path , notice: "Ok"
        end

first_step.js.erb で

$("#modal").html("<%= escape_javascript(render 'form_first_step') %>")

_form_first_step.html.erb:

<% if @r.errors.any? %>
   <div class="alert fade in alert-danger alert-dismissable"><button aria-hidden="true" class="close" data-dismiss="alert" type="button">&#215;</button>
      <ul>
         <% @r.errors.full_messages.each do |msg| %>
            <%= content_tag :li, msg, :id => "error_#{msg}" if msg.is_a?(String) %>
          <% end %>
      </ul>
    </div>
<% end %>

<%= form_for(@room_types, url: wizard_path, method: :put, remote: true) do |f| %>
   ...
<% end %>

2 番目の形式 (2 番目のステップの):

<%= form_for(@room_types, url: wizard_path(:second_step), method: :put, remote: true) do |f| %>
    ....
    <%= f.hidden_field :id %>
<% end %>

アイデア: jquery-form-validator-railsを使用できる手順でデータを検証するには

于 2016-09-07T16:23:52.070 に答える
1

#render_wizardで定義されているメソッドは、メソッドのWicked::Controller::Concerns::RenderRedirectラッパー メソッドActionController::Base#renderです。オプションのハッシュを受け取り、コントローラーの通常の#renderメソッドに渡します。

これは Wicked ライブラリのソース コードです。

def render_wizard(resource = nil, options = {})
  ...

  if @skip_to
    ...
  else
    render_step wizard_value(step), options
  end
end

def render_step(the_step, options = {})
  if the_step.nil? || the_step.to_s == Wicked::FINISH_STEP
    ...
  else
    render the_step, options #<-- Here
  end
end

あなたのコード:

respond_to do |format|
  format.js { render :js => ( render_wizard @r ) }  
end

基本的にやっています:

respond_to do |format|
  format.js { render :js => ( render @r ) }  
end

実際には render メソッドを 2 回呼び出しています。

.htmlテンプレートではなくテンプレートを検索しているため、render_wizard メソッドにオプションを.js.erb追加してみてください。エラー メッセージに表示されるformats: 'js'の先頭に ['js'] を追加する必要があります。:formats=>[:html]Missing template

respond_to do |format|
  format.js { render_wizard(@r, formats: 'js') }
end

また、テンプレートのファイル名が Rails の規則に従い、. で始まることを確認してください_。(つまり: _second_step.js.erb)


二重レンダリングエラーについては、あなたは正しいです。コントローラー#showまたはメソッドから戻り、それ以降のコードがメソッドを 2 回#update呼び出さないようにする必要があります。#renderあなたはすでにその問題を解決しているようです。

編集#1

コントローラーでこのメソッドを直接呼び出すことができるようです..:

def render_step(the_step, options = {})
  # Wicked::FINISH_STEP = "wicked_finish"
  if the_step.nil? || the_step.to_s == Wicked::FINISH_STEP
    redirect_to_finish_wizard options
  else
    render the_step, options
  end
end

the_stepパーシャルの名前になると思います。#render_stepコントローラーからメソッドを呼び出すことができるはずだと思います。

あなたはできるかもしれません:

def show
  respond_to do |f|
    f.js do
      case step
      when :first_step
          @r  = R.new
          render_step(step) and return
      when :second_step
        ...
      end
    end
  end
end
于 2016-09-07T12:40:00.040 に答える