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
尝试解决方案
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
但是,我没有走得太远。有什么想法吗?
答案 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