我的 routes.rb 文件中有以下自定义路由:
match '/security_users/:id/email_confirmation/:activation_code' => 'email_confirmation#new'
并希望创建自定义帮助程序,为指定的 SecurityUser 生成上述路径。在我的application_controler.rb文件中,我有上面的方法:
class ApplicationController < ActionController::Base
protect_from_forgery
private
def email_confirmation_path(security_user)
"/security_users/#{security_user.id}/email_confirmation/#{security_user.activation_code}"
end
helper_method :email_confirmation_path
end
但是当我在我的/views/security_user_mailer/email_confirmation.text.erb模板中调用它时,这样:
<%= email_confirmation_path(@security_user) %>
我收到以下错误:
你可以建议吗?/ security_users未定义方法的NoMethodError 对于#&lt;#:0x6340ff53&gt;
,`email_confirmation_path'
编辑:
您可以在下面找到流程工作流程:
首先,当创建用户时,执行以下行
@security_user.send_email_confirmation
上述方法在对象模型文件中定义如下:
def send_email_confirmation
SecurityUserMailer.email_confirmation(self).deliver
end
然后在邮件程序控制器中,调用以下方法:
def email_confirmation(security_user)
@security_user = security_user
mail to: security_user.email, subject: 'Account Created'
end
之前的方法是使用我的模板,我需要在其中调用自定义路径生成器方法:
<%= email_confirmation_path(@security_user) %>
但是我得到错误,它是未定义的。
答案 0 :(得分:3)
来自控制器的辅助方法在邮件程序视图中不可用。您应该将方法放在辅助模块中,例如app/helpers/application_helper.rb
:
module ApplicationHelper
def email_confirmation_path(security_user)
"/security_users/#{security_user.id}/email_confirmation/#{security_user.activation_code}"
end
end
然后您应该告诉您的邮件程序类使用该帮助程序模块(假设您的邮件程序为app/mailers/mailer.rb
):
class Mailer < ActionMailer::Base
add_template_helper(ApplicationHelper)
end
之后,您将能够在邮件程序的视图中使用该帮助程序。
P.S。另请注意,Ruby中的private
修饰符不会将对方法的访问权限仅限于定义它的类。子类也可以调用它。 Private
表示无法相对于obj.my_method
这样的对象调用方法,但只能与self
隐式调用方法my_method
。
答案 1 :(得分:1)
该方法在ApplicationController中是私有的,因此子类无法访问它。你应该把它放在你班级的受保护或公共部分。