Ruby on rails Rails未初始化的常量Marketing::InviteController::MarketingMailer-仅在某些情况下发生
我正在尝试创建一个简单的表单来收集电子邮件地址,然后向我发送电子邮件 我随机获得Ruby on rails Rails未初始化的常量Marketing::InviteController::MarketingMailer-仅在某些情况下发生,ruby-on-rails,ruby,ruby-on-rails-3,mailer,Ruby On Rails,Ruby,Ruby On Rails 3,Mailer,我正在尝试创建一个简单的表单来收集电子邮件地址,然后向我发送电子邮件 我随机获得未初始化的常量Marketing::InviteController::MarketingMailer,有时是第一次提交表单,但总是第二次提交,因此如果您转到localhost:3000/request invite,输入电子邮件并提交表单,然后输入电子邮件并再次提交表单,您将得到这个错误 知道我为什么会犯这个错误吗 /控制器/营销/invite_controller.rb class Marketing::Invi
未初始化的常量Marketing::InviteController::MarketingMailer
,有时是第一次提交表单,但总是第二次提交,因此如果您转到localhost:3000/request invite,输入电子邮件并提交表单,然后输入电子邮件并再次提交表单,您将得到这个错误
知道我为什么会犯这个错误吗
/控制器/营销/invite_controller.rb
class Marketing::InviteController < ApplicationController
layout 'marketing/layouts/layout'
# GET /request-invite
def new
@invite = Invite.new
respond_to do |format|
format.html # new.html.erb
end
end
# POST /request-invite
def create
@invite = Invite.new(params[:invite])
respond_to do |format|
if @invite.save
MarketingMailer.invite(@invite.email).deliver
format.html { redirect_to request_invite_path, notice: 'Success' }
else
format.html { render action: "new", error: 'An error has occurred' }
end
end
end
end
我认为你应该像你在代码中定义的那样引用你的邮件,而不是
MarketingMailer
,MarketingMailer我认为你应该像你在代码中定义的那样引用你的邮件,而不是MarketingMailer
,这听起来像是自动加载问题。您是否尝试过使用全名引用MarketingMailer常量营销:营销邮递员
Rails不会在开发中加载所有类。相反,当一个类丢失时,Rails会尝试根据一组自动加载路径猜测在项目中的何处查找该类
例如,应用程序文件夹中的所有文件夹都将添加到自动加载路径中。因此,如果您引用Foobar.new,Rails将在您的应用程序/模型或应用程序/控制器中查找Foobar.rb文件,该文件预期包含类Foobar
定义。然而,当你使用模块时,水会变得更加浑浊
class Foo::Bar
# some code
Baz.new
end
Rails现在认为Baz类是在位于子文件夹中的Baz.rb类中定义的,因此它将在自动加载文件夹中查找并搜索根据封闭模块命名的子文件夹,检查app/models/foo/bar/Baz.rb和app/controllers/foo/bar/Baz.rb
当它找不到任何东西时,Rails有不同的解决方法,我不完全理解。但是,如果使用两个冒号作为类引用的前缀,则意味着您是从根命名空间引用的,Rails不应尝试相对于当前模块进行搜索,因此如果我们再次使用上述示例:
class Foo::Bar
...
Baz.new # Searches for foo/bar/baz.rb
::Baz.new # Searches for baz.rb
::My::Baz.new # Searches for my/baz.rb
My::Baz.new # Searches for foo/bar/my/baz.rb
...
end
在生产模式下,这些问题大部分都会消失,因为Rails会预加载项目中的所有源文件,所以如果在任何文件夹中的任何位置都定义了Baz
,Rails就不必猜测在哪里可以找到它。它已经存在,因为它已经加载。听起来像是自动加载问题。您是否尝试过使用全名引用MarketingMailer常量营销:营销邮递员
Rails不会在开发中加载所有类。相反,当一个类丢失时,Rails会尝试根据一组自动加载路径猜测在项目中的何处查找该类
例如,应用程序文件夹中的所有文件夹都将添加到自动加载路径中。因此,如果您引用Foobar.new,Rails将在您的应用程序/模型或应用程序/控制器中查找Foobar.rb文件,该文件预期包含类Foobar
定义。然而,当你使用模块时,水会变得更加浑浊
class Foo::Bar
# some code
Baz.new
end
Rails现在认为Baz类是在位于子文件夹中的Baz.rb类中定义的,因此它将在自动加载文件夹中查找并搜索根据封闭模块命名的子文件夹,检查app/models/foo/bar/Baz.rb和app/controllers/foo/bar/Baz.rb
当它找不到任何东西时,Rails有不同的解决方法,我不完全理解。但是,如果使用两个冒号作为类引用的前缀,则意味着您是从根命名空间引用的,Rails不应尝试相对于当前模块进行搜索,因此如果我们再次使用上述示例:
class Foo::Bar
...
Baz.new # Searches for foo/bar/baz.rb
::Baz.new # Searches for baz.rb
::My::Baz.new # Searches for my/baz.rb
My::Baz.new # Searches for foo/bar/my/baz.rb
...
end
在生产模式下,这些问题大部分都会消失,因为Rails会预加载项目中的所有源文件,所以如果在任何文件夹中的任何位置都定义了Baz
,Rails就不必猜测在哪里可以找到它。它已经存在,因为它已经加载。在生产中也会发生这种情况吗?听起来像是自动加载问题。您是否尝试过使用全名引用MarketingMailer常量<代码>::市场营销::市场营销邮递员
它还没有投入生产。仅在dev.:Marketing::MarketingMailer.invite(@invite.email).deliver中尝试过。似乎解决了这个问题。这是引用邮件的正确方法吗?我从未见过任何以:
开头的引用。另外,你能回答这个问题吗,这样我就可以给你道具了?这在制作中也会发生吗?听起来像是自动加载问题。您是否尝试过使用全名引用MarketingMailer常量<代码>::市场营销::市场营销邮递员
它还没有投入生产。仅在dev.:Marketing::MarketingMailer.invite(@invite.email).deliver中尝试过。似乎解决了这个问题。这是引用邮件的正确方法吗?我从未见过任何以:
开头的引用。还有,你能回答这个问题,这样我就可以给你道具了吗?
class Foo::Bar
# some code
Baz.new
end
class Foo::Bar
...
Baz.new # Searches for foo/bar/baz.rb
::Baz.new # Searches for baz.rb
::My::Baz.new # Searches for my/baz.rb
My::Baz.new # Searches for foo/bar/my/baz.rb
...
end