0

私のプロファイルモデルを真のwelcome_controllerに更新しようとしています。この理由は、ユーザーが最初のプロファイルを作成する場合に、ウェルカム ウィザードとしていくつかの手順があるためです。

IDを提供していないため、ルーティングを正しく取得できません。

  • welcome#edit/ :step は正しいステップを読み込みます
  • welcome#update は、プロファイル属性を更新し、それがオンになっているステップを保存する必要があります (合計 3 つのステップ)

ルート.rb

  match "/welcome/:step" => "welcome#edit"
  match "/welcome" => "welcome#edit"
  resources :welcome

welcome_controller の更新および編集アクション:

    def edit
    # form updates post to edit since
    # profile is non existant yet

    params[:step] = "photos" unless params[:step]
    @photos   = Photo.where(:attachable_id => current_user.id)
    @profile  = Profile.where(:user_id => current_user.id).first
    @photo    = Photo.new


    if ["photos", "basics", "details"].member?(params[:step])
      render :template => "/profiles/edit/edit_#{ params[:step]}", :layout => "welcome"
    else
      render :action => "/profiles/edit_photos"
    end

    end

  # update profile attributes then update the correct step
  def update

    raise('welcome update called')
    @profile = Profile.where(:user_id => current_user.id).first
    @profile.update_attributes(params[:profile])

    case params[:step] # update the steps
      when "photos"
        current_user.update_attributes(:welcome => 1)
      when "basics"
        current_user.update_attributes(:welcome => 2)
      when "details"
        current_user.update_attributes(:welcome => 3)
    end

    # redirect to welcome_path before_filter determine step
    redirect_to welcome_path
  end

写真、基本、詳細のフォームは @profile の form_for にすぎないので、プロファイルに投稿しますが、代わりにウェルカムコントローラーに投稿したいと思います:(

これにアプローチする最良の方法は何ですか? これに完全に行き詰まった

4

1 に答える 1

1

この問題に対して利用できるアプローチがいくつかあります。

  1. セッションを使用します。すべてのステップでいくつかの検証が実行され、最終ステップに到達するまで、セッションに保存されている一連のシリアル化されたパラメーターが更新されます。私はこれの大ファンではありませんが、単純なアプリでは機能します。
  2. いくつかの js/css トリック (タブ、「次へ」ボタンと「前へ」ボタンを備えた「スライドショーのような」ページ) を備えた単一のフォームを使用して、フォームの煩雑さを軽減します。これはすべての問題に当てはまるわけではありませんが、多くの場合、複数ステップのフォームは実際には複数のラウンドトリップを必要とせず、UX を改善するための手段であることがわかりました。
  3. 前のステップのすべてのパラメーターを非表示の入力フィールドとしてシリアル化します。あまり良いアイデアではありませんが、繰り返しになりますが、小さなアプリでは「うまくいく」可能性があります。
  4. 状態ごとに異なる検証を行うステート マシンとして、「マルチステップ フォーム」モデルを作成します。各ステップで、モデルを (データベースまたはメモリ キャッシュに) 保存して、次のフォームに提供できる ID を取得します。保存が成功するたびに、状態が適切なステップに変更されます。このアプローチの問題は、何らかの形で破棄する必要がある「放棄された」フォームを処理する方法です (cron ジョブを使用してデータベースをクリーンアップするか、メモリキャッシュの有効期限設定を使用します)。
于 2013-06-03T17:46:15.307 に答える