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

照片、基本和详细信息的表格只是一个 form_for @profile 所以我将它发布到个人资料但想将它发布到欢迎控制器:(

解决这个问题的最佳方法是什么?完全停留在这个

4

1 回答 1

1

有几种方法可以解决这个问题。

  1. 使用会话。每一步都会运行几次验证,然后更新存储在会话中的一组序列化参数,直到到达最后一步。我不是这个的忠实粉丝,但它适用于简单的应用程序。
  2. 使用带有一些 js/css 技巧的单一表单(选项卡、带有“下一个”和“上一个”按钮的“幻灯片式”页面)让您的表单感觉不那么繁琐。这并不适用于所有问题,但我发现很多时候多步骤表单实际上并不需要多次往返,只是让用户体验更好的一种方式。
  3. 将前面步骤中的所有参数序列化为隐藏输入字段。这不是一个好主意,但同样,它可以“正常工作”用于小型应用程序。
  4. 创建一个“多步骤表单”模型,作为对每个状态具有不同验证的状态机。在每一步,保存模型(在数据库中,或在内存缓存中),以便您有一个 id 可以提供给下一个表单。每次成功的保存也会将状态更改为适当的步骤。这种方法的问题是如何处理“废弃”的表单,你必须以某种方式销毁它们(使用 cron 作业清理数据库,或使用内存缓存过期设置)。
于 2013-06-03T17:46:15.307 回答