0

このレールキャストを使用して作成したマルチステップ フォーム (ウィザード) があります: http://railscasts.com/episodes/217-multistep-forms

フォームに入力されたすべての情報を記憶するためにセッションが使用されています。1 つのフォーム ページに、3 つのオプションを持つ選択ボックスがあり、各オプションはページに異なるフォーム フィールドを表示します。オプションは次のとおりです。「小売およびオフィス」(小売とオフィスの両方のフィールドが表示されます)、「オフィスのみ」(オフィスのフィールドのみが表示されます)、「小売のみ」(小売のフィールドのみが表示されます)。

選択ボックスで選択したオプションに基づいて、jquery を使用してこれらのフィールドを表示および非表示にしました。だからここに私が抱えている問題があります。たとえば、選択ボックスから「小売のみ」を選択したとします。オフィス分野が消え、小売分野のみが表示されます。フィールドに情報を入力し、次のステップに進みます。ただし、戻るボタンを押してこのステップに戻って編集すると、オフィス フィールドと小売フィールドの両方が表示されます。選択ボックスの [小売店のみ] の選択は同じままで、入力した情報もそのままですが、両方のフィールドが表示されています。

問題はjqueryにあり、Railsセッションにはないと思います。これはクッキーと関係がありますか? これを修正するにはどうすればよいですか?

アプリケーション.js

$(document).ready(function() {

$("#spaces").change(function(){
if ($("#spaces").val()=="Retail only") {$("#office_field").hide(); $("#retail_field").show(); }
if ($("#spaces").val()=="Office only") {$("#office_field").show(); $("#retail_field").hide(); }
if ($("#spaces").val()=="Retail and Office") {$("#office_field").show(); $("#retail_field").show(); }

});

uploads_controller.rb

class UploadsController < ApplicationController
  def index
    @uploads = Upload.all
  end

  def show
    @upload = Upload.find(params[:id])
  end

  def new
    session[:upload_params] ||= {}
    @upload = Upload.new(session[:upload_params])
    @upload.current_step = session[:upload_step]
  end

  def create
    session[:upload_params].deep_merge!(params[:upload]) if params[:upload]
    @upload = Upload.new(session[:upload_params])
    @upload.current_step = session[:upload_step]
    if @upload.valid?
        if params[:back_button]
        @upload.previous_step
    elsif @upload.last_step?
        @upload.save if @upload.all_valid?
        else
        @upload.next_step
        end
        session[:upload_step] = @upload.current_step
    end
    if @upload.new_record?
        render "new"
    else
        session[:upload_step] = session[:upload_params] = nil
        flash[:notice] = "Upload saved"
        redirect_to @upload
    end
  end
end
4

1 に答える 1

0

application.jsには、「change」イベントリスナーしかありません。必要なのは、特定の入力を表示/非表示にするコードをトリガーして、#spacesの「change」イベントにのみバインドすることです。

if ($("#spaces").val()=="Retail only") {$("#office_field").hide(); $("#retail_field").show(); }
if ($("#spaces").val()=="Office only") {$("#office_field").show(); $("#retail_field").hide(); }
if ($("#spaces").val()=="Retail and Office") {$("#office_field").show(); $("#retail_field").show(); }

基本的に、このコードを関数に移動し、ページの読み込みと#spaces'change'の両方でこの関数を呼び出す必要があります。

$(document).ready(function() {

  function retail_office_fields() {
    if ($("#spaces").val()=="Retail only") {$("#office_field").hide(); $("#retail_field").show(); }
    if ($("#spaces").val()=="Office only") {$("#office_field").show(); $("#retail_field").hide(); }
    if ($("#spaces").val()=="Retail and Office") {$("#office_field").show(); $("#retail_field").show(); }
  }

  retail_office_fields();

  $("#spaces").change(retail_office_fields);
});

それはセッションとは何の関係もありません。

于 2012-06-01T16:00:03.313 に答える