Forms Rails 4欢迎向导,如何更正此代码以使其适用于Rails 4?
尝试构建一个欢迎向导,并尝试将现有的rails代码移植为与rails 4兼容的代码。主要基于之前的伟大答案: 这导致:Forms Rails 4欢迎向导,如何更正此代码以使其适用于Rails 4?,forms,ruby-on-rails-4,delegates,Forms,Ruby On Rails 4,Delegates,尝试构建一个欢迎向导,并尝试将现有的rails代码移植为与rails 4兼容的代码。主要基于之前的伟大答案: 这导致: Circular dependency detected while autoloading constant WelcomeController app/controller/welcome\u controller.rb class Welcome::ApplicationController < ::ApplicationController layout "
Circular dependency detected while autoloading constant WelcomeController
app/controller/welcome\u controller.rb
class Welcome::ApplicationController < ::ApplicationController
layout "welcome"
before_filter :authentice_user!
end
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
namespace :welcome do
resource :basics, :only => [:new, :create]
end
class WelcomeBasic
include ActiveModel::Model # Necessary for Rails 4
include ActiveModel::Validations
include ActiveModel::Conversion
extend ActiveModel::Naming
...
end
class Welcome::WelcomeController < ApplicationController
layout "welcome"
before_filter :authenticate_user!
end
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
...
namespace :welcome do
resources :basics, :only => [:new, :create]
end
...
/config/routes.rb
class Welcome::ApplicationController < ::ApplicationController
layout "welcome"
before_filter :authentice_user!
end
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
namespace :welcome do
resource :basics, :only => [:new, :create]
end
class WelcomeBasic
include ActiveModel::Model # Necessary for Rails 4
include ActiveModel::Validations
include ActiveModel::Conversion
extend ActiveModel::Naming
...
end
class Welcome::WelcomeController < ApplicationController
layout "welcome"
before_filter :authenticate_user!
end
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
...
namespace :welcome do
resources :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\u controller.rb
中,您有authentice user
,它应该是authenticate user
在您的welcome\u basics\u controller.rb中,您在定义中拼错了controller,当前:welcome::basiccontroller
应该是welcome::basiccontroller
我还建议您将命名和继承更改为更简单一些,更符合Rails约定而不是配置。这就是我的方法:
因为welcome_basics.rb是一个伪模型,所以我将它放在它自己的目录中,以防止任何潜在的ActiveModel自动寻源。我还将名称改为单数,以符合Rails对模型的约定
app/pseudo\u models/welcome\u basic.rb
class Welcome::ApplicationController < ::ApplicationController
layout "welcome"
before_filter :authentice_user!
end
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
namespace :welcome do
resource :basics, :only => [:new, :create]
end
class WelcomeBasic
include ActiveModel::Model # Necessary for Rails 4
include ActiveModel::Validations
include ActiveModel::Conversion
extend ActiveModel::Naming
...
end
class Welcome::WelcomeController < ApplicationController
layout "welcome"
before_filter :authenticate_user!
end
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
...
namespace :welcome do
resources :basics, :only => [:new, :create]
end
...
现在,我将您的welcome\u控制器放在控制器目录中名为“welcome”的子目录中:
app/controller/welcome/welcome\u controller.rb
class Welcome::ApplicationController < ::ApplicationController
layout "welcome"
before_filter :authentice_user!
end
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
namespace :welcome do
resource :basics, :only => [:new, :create]
end
class WelcomeBasic
include ActiveModel::Model # Necessary for Rails 4
include ActiveModel::Validations
include ActiveModel::Conversion
extend ActiveModel::Naming
...
end
class Welcome::WelcomeController < ApplicationController
layout "welcome"
before_filter :authenticate_user!
end
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
...
namespace :welcome do
resources :basics, :only => [:new, :create]
end
...
/config/routes.rb
class Welcome::ApplicationController < ::ApplicationController
layout "welcome"
before_filter :authentice_user!
end
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
namespace :welcome do
resource :basics, :only => [:new, :create]
end
class WelcomeBasic
include ActiveModel::Model # Necessary for Rails 4
include ActiveModel::Validations
include ActiveModel::Conversion
extend ActiveModel::Naming
...
end
class Welcome::WelcomeController < ApplicationController
layout "welcome"
before_filter :authenticate_user!
end
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
...
namespace :welcome do
resources :basics, :only => [:new, :create]
end
...
您需要确保的另一件事是,相应的视图与控制器放置在同一目录结构中,因此您应该具有以下功能:
/app/views/welcome/basics/welcome.html.erb
class Welcome::ApplicationController < ::ApplicationController
layout "welcome"
before_filter :authentice_user!
end
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
namespace :welcome do
resource :basics, :only => [:new, :create]
end
class WelcomeBasic
include ActiveModel::Model # Necessary for Rails 4
include ActiveModel::Validations
include ActiveModel::Conversion
extend ActiveModel::Naming
...
end
class Welcome::WelcomeController < ApplicationController
layout "welcome"
before_filter :authenticate_user!
end
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
...
namespace :welcome do
resources :basics, :only => [:new, :create]
end
...
还有一个提示,当你说“我试着打电话给http://books:3000/welcome/basics
“,我想您的意思是您试图发布表单?否则,您应该调用http://books:3000/welcome/basics/new
以获取基本表单。如果您希望该路线映射到http://books:3000/welcome/basics
您需要在您的配置/routes.rb
文件中进行相应的调整。我看到一些问题似乎没有解决。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\u controller.rb
中,您有authentice user
,它应该是authenticate user
在您的welcome\u basics\u controller.rb中,您在定义中拼错了controller,当前:welcome::basiccontroller
应该是welcome::basiccontroller
我还建议您将命名和继承更改为更简单一些,更符合Rails约定而不是配置。这就是我的方法:
因为welcome_basics.rb是一个伪模型,所以我将它放在它自己的目录中,以防止任何潜在的ActiveModel自动寻源。我还将名称改为单数,以符合Rails对模型的约定
app/pseudo\u models/welcome\u basic.rb
class Welcome::ApplicationController < ::ApplicationController
layout "welcome"
before_filter :authentice_user!
end
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
namespace :welcome do
resource :basics, :only => [:new, :create]
end
class WelcomeBasic
include ActiveModel::Model # Necessary for Rails 4
include ActiveModel::Validations
include ActiveModel::Conversion
extend ActiveModel::Naming
...
end
class Welcome::WelcomeController < ApplicationController
layout "welcome"
before_filter :authenticate_user!
end
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
...
namespace :welcome do
resources :basics, :only => [:new, :create]
end
...
现在,我将您的welcome\u控制器放在控制器目录中名为“welcome”的子目录中:
app/controller/welcome/welcome\u controller.rb
class Welcome::ApplicationController < ::ApplicationController
layout "welcome"
before_filter :authentice_user!
end
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
namespace :welcome do
resource :basics, :only => [:new, :create]
end
class WelcomeBasic
include ActiveModel::Model # Necessary for Rails 4
include ActiveModel::Validations
include ActiveModel::Conversion
extend ActiveModel::Naming
...
end
class Welcome::WelcomeController < ApplicationController
layout "welcome"
before_filter :authenticate_user!
end
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
...
namespace :welcome do
resources :basics, :only => [:new, :create]
end
...
/config/routes.rb
class Welcome::ApplicationController < ::ApplicationController
layout "welcome"
before_filter :authentice_user!
end
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
namespace :welcome do
resource :basics, :only => [:new, :create]
end
class WelcomeBasic
include ActiveModel::Model # Necessary for Rails 4
include ActiveModel::Validations
include ActiveModel::Conversion
extend ActiveModel::Naming
...
end
class Welcome::WelcomeController < ApplicationController
layout "welcome"
before_filter :authenticate_user!
end
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
...
namespace :welcome do
resources :basics, :only => [:new, :create]
end
...
您需要确保的另一件事是,相应的视图与控制器放置在同一目录结构中,因此您应该具有以下功能:
/app/views/welcome/basics/welcome.html.erb
class Welcome::ApplicationController < ::ApplicationController
layout "welcome"
before_filter :authentice_user!
end
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
namespace :welcome do
resource :basics, :only => [:new, :create]
end
class WelcomeBasic
include ActiveModel::Model # Necessary for Rails 4
include ActiveModel::Validations
include ActiveModel::Conversion
extend ActiveModel::Naming
...
end
class Welcome::WelcomeController < ApplicationController
layout "welcome"
before_filter :authenticate_user!
end
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
...
namespace :welcome do
resources :basics, :only => [:new, :create]
end
...
还有一个提示,当你说“我试着打电话给http://books:3000/welcome/basics
“,我想您的意思是您试图发布表单?否则,您应该调用http://books:3000/welcome/basics/new
以获取基本表单。如果您希望该路线映射到http://books:3000/welcome/basics
您需要在配置/routes.rb
文件中进行相应的调整。是否有理由拆分这两个控制器而不是只使用一个?您是否尝试实施我的解决方案?您还有什么问题?是否有理由拆分这两个控制器而不是只使用一个?您是否尝试实施我的解决方案?你还有什么问题吗?使用rails generate controller welcome/basics
,它会为你创建合适的目录。好的,写得很好,谢谢,让我了解了更多正确的方向。如何让欢迎控制器更新配置文件?当然,它仍然路由到我的profiles控制器——当我有@profiles的简单表单时,问题是我使用@profile模型来存储我的所有值,目前这个实现依赖于welcome\u basics模型来保存这些值,这增加了额外的复杂性。如果将这些概要文件属性添加到attr\u accessible(可能1),您可以告诉simple\u form\u您希望它使用哪条路由。2) 假设您的整个设置都是基于使用伪模型(我建议对这个伪模型使用WelcomeBasic命名)一步一步地存储属性,一旦您拥有了所有属性,就可以将它们保存到实际的模型中。尝试以下操作:simple_form_for(:welcome_basic,url:welcome_basics_path)do | f |
注意:如果添加视图代码,这将有助于更彻底地诊断遇到的问题,我可以适当地更新我的答案。谢谢Paul,我将深入研究这一点,希望能够重构我的旧代码并使其正常工作。再次感谢您内容丰富的来信!使用rails generate controller welcome/basics
,它将为您创建合适的目录。好的,非常好的书面感谢让我了解了更多正确的方向。如何让欢迎控制器更新配置文件?是s