Rails 4.2多步向导的命名约定

时间:2017-06-30 11:05:07

标签: ruby-on-rails ruby ruby-on-rails-4

Rails 4.2

我为User模型创建了一个多步骤向导,即应用程序的访问者通过4步形式注册为User。它正在进行当前的设置。

但是,我必须使用require语句来包含几个与向导相关的ruby文件。因此,Rails不会自动加载这些文件。

我想重构相关文件,以便它们遵循Rails约定并且能够自动加载。

目前的结构 - 正在运作

app / wizards / user.rb 用户向导模型 - 在每个步骤上运行验证等

module Wizard
  module User
    STEPS = %w[step1 step2 step3 step4].freeze

    # omitted class implementations, not relevant
    class Base
    end
    class Step1 < Base
    end
    class Step2 < Step1
    end
    class Step3 < Step2
    end
    class Step4 < Step3
    end
  end
end

应用程序/控制器/ user_wizards_controller.rb

# I have to require the file above, would like to avoid
require Rails.root.join('app', 'wizards', 'user.rb')

class UserWizardsController < ApplicationController

  # I have to specify the template, would like to avoid
  def step1
    render 'wizards/users/step1'
  end

  # Notice how I have to refer to module/classes above.
  def wizard_user_for_step(step)
    raise InvalidStep unless step.in?(::Wizard::User::STEPS)

    "Wizard::User::#{step.camelize}".constantize.new(session[:user_attributes])
  end
end

应用程序/视图/向导/用户/ step1.html.erb

应用程序/视图/向导/用户/ step2.html.erb

尝试解决方案

基于此statement by xfn

  

autoload_paths中的目录被视为根目录,它们不反映命名空间。例如,app / models下面的类不在Models名称空间下,任何名称空间都必须在该目录中。

     

例如,文件app / services / doctor_finder.rb不遵循自动加载约定,因为它定义了Services :: DoctorFinder而不是DoctorFinder。因此,该文件无法自动加载。

我要去......

模型

应用程序/向导/用户/ user.rb

应用程序/向导/用户/ base.rb

应用程序/向导/用户/ step1.rb

应用程序/向导/用户/ step2.rb

应用程序/向导/用户/ step3.rb

应用程序/向导/用户/ step4.rb

但是,我没有走得太远。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

如果要自动加载这些文件,请将其移至例如服务或步骤目录中,如:

 app/services/wizards/user/step1 

和rails应该自动加载模块:

 module Wizards::User
    class Step1
    end
 end

依赖rails版本,您需要添加&#39;服务&#39;自动加载路径。

问候观点:

 render 'wizards/users/step1'

并不坏,在我看来可以认为是一种很好的做法。(使用渲染方法可以让你传递非全局变量来查看)

如果要删除此行,则应将UserWizardsController的视图放入user_wizards / step1.html.xxx

或者如果你想在向导/ users / step1.html.xxx中查看 你应该以这种方式控制你的控制器:

module Wizards
  class UsersController < ApplicationController
  end
edn