Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Forms Rails 4欢迎向导,如何更正此代码以使其适用于Rails 4?_Forms_Ruby On Rails 4_Delegates - Fatal编程技术网

Forms Rails 4欢迎向导,如何更正此代码以使其适用于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 "

尝试构建一个欢迎向导,并尝试将现有的rails代码移植为与rails 4兼容的代码。主要基于之前的伟大答案:

这导致:

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