尝试构建一个欢迎向导,并尝试将现有的 rails 代码移植为与 rails 4 兼容。主要基于之前的好答案:https://stackoverflow.com/a/17255451/355281
I try to call http://books:3000/welcome/basics
这导致:
Circular dependency detected while autoloading constant WelcomeController
app/controllers/welcome_controller.rb
class Welcome::ApplicationController < ::ApplicationController
layout "welcome"
before_filter :authentice_user!
end
app/controllers/welcome_basics_controller.rb
class Welcome::BasicsControlller < Welcome::ApplicationController
before_action :authenticate_user!
before_filter :allowed?
def new
@step = Welcome::Basics.new(current_user)
end
def create
@step = Welcome::Basics.new(current_user)
if @step.save(params[:welcome_basics])
redirect_to welcome_some_other_step_path, :notice => "Yay"
else
render :new
end
end
private
def step
@step ||= Welcome::Basics.new(current_user)
end
helper_method :step
def allowed?
redirect_to previous_step_path unless step.allowed?
end
end
**app/models/welcome_basics.rb
class Welcome::Basics
include ActiveModel::Validations
include ActiveModel::Conversion
extend ActiveModel::Naming
def persisted?
false
end
def initialize(user)
@user = user
end
attr_reader :user
delegate :some_field, :some_other_field, :to => :user
validates_presence_of :some_field
def save(params)
user.some_field = params[:some_field]
user.some_other_field = params[:some_other_field]
if valid?
user.step = 2
user.save
end
end
def photo
@photo ||= Photo.new
end
def profile
@profile ||= user.profiles.first
end
end
/config/routes.rb
namespace :welcome do
resource :basics, :only => [:new, :create]
end
我看到一些似乎不对劲的东西。Rails 4 与 Rails 3.2 的最大问题似乎是伪模型定义。
class Welcome::Basics
include ActiveModel::Model # Necessary for Rails 4
include ActiveModel::Validations
include ActiveModel::Conversion
extend ActiveModel::Naming
...
end
在你的welcome_controller.rb
中,你有authentice user
应该读authenticate user
。
在您的welcome_basics_controller.rb
中,您在定义中拼写错误的控制器,目前:Welcome::BasicsControlller
应该Welcome::BasicsController
。
我还建议您更改命名和继承,使其更简单一些,并且更符合配置上的 Rails 约定。 这将是我的方法:
由于welcome_basics.rb是一个伪模型,我会把它放在它自己的目录中,以防止任何潜在的ActiveModel自动来源。我还会将名称更改为单数,以符合模型的 Rails 约定。
app/pseudo_models/welcome_basic.rb
class WelcomeBasic
include ActiveModel::Model # Necessary for Rails 4
include ActiveModel::Validations
include ActiveModel::Conversion
extend ActiveModel::Naming
...
end
现在,我将welcome_controller放在控制器目录中名为"welcome"的子目录中:
app/controllers/welcome/welcome_controller.rb
class Welcome::WelcomeController < ApplicationController
layout "welcome"
before_filter :authenticate_user!
end
然后,您的基本控制器应该在"welcome"目录中称为basics,并且由于您从欢迎控制器继承,因此您无需重复authenticate_user!
行。 另请记住,您需要将对伪模型的调用从 Welcome::Basics
重命名为 WelcomeBasic
。 对于 Rails 4,您还需要在控制器中实现强大的参数。
app/controllers/welcome/basics_controller.rb
class Welcome::BasicsController < Welcome::WelcomeController
before_filter :allowed?
def new
@step = WelcomeBasic.new(current_user)
end
def create
@step = WelcomeBasic.new(current_user)
if @step.save(basic_params) #updated to use strong_params
redirect_to welcome_some_other_step_path, :notice => "Yay"
else
render :new
end
end
private
#For strong_params
def basic_params
params.require(:welcome_basic).permit(:attribute1, :attribute2)
end
def step
@step ||= WelcomeBasic.new(current_user)
end
helper_method :step
def allowed?
redirect_to previous_step_path unless step.allowed?
end
end
/config/routes.rb
...
namespace :welcome do
resources :basics, :only => [:new, :create]
end
...
您需要确保的另一件事是,相应的视图与控制器位于同一目录结构中,因此您应该具有以下内容:
/app/views/welcome/basics/welcome.html.erb
另一个注意事项,当您说"我尝试打电话给http://books:3000/welcome/basics
"时,我假设您的意思是您试图发布您的表格? 否则,您应该调用http://books:3000/welcome/basics/new
以获取基本表单。 如果您希望该路由映射到http://books:3000/welcome/basics
则需要在config/routes.rb
文件中进行相应的调整。