Rails 4 欢迎向导,如何更正此代码以使其适用于 Rails 4



尝试构建一个欢迎向导,并尝试将现有的 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文件中进行相应的调整。

最新更新