我的 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) %>
我收到以下错误:
NoMethodError at /security_users undefined method `email_confirmation_path' for #<#:0x6340ff53>
你能给点建议吗?
编辑:
下面您可以找到流程工作流程:
首先,创建用户时执行以下行
@security_user.send_email_confirmation
上面的方法在对象模型文件中定义如下:
def send_email_confirmation
SecurityUserMailer.email_confirmation(self).deliver
end
然后在邮件 Controller 中,调用以下方法:
def email_confirmation(security_user)
@security_user = security_user
mail to: security_user.email, subject: 'Account Created'
end
前面的方法是使用我的模板,其中我需要调用自定义路径生成器方法:
<%= email_confirmation_path(@security_user) %>
但我收到错误,它未定义。
最佳答案
Controller 中的帮助程序方法在邮件程序 View 中不可用。您应该将您的方法放入辅助模块中,例如 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
之后,您将能够在邮件程序的 View 中使用该帮助程序。
附:另请注意,Ruby 中的 private
修饰符并不将对方法的访问限制为仅定义该方法的类。子类也可以调用它。 Private
意味着不能像 obj.my_method
这样与对象相关的方法被调用,而只能与 self
相关的隐式调用就像这样my_method
。
关于ruby-on-rails-3 - 自定义辅助方法上的 "undefined method",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17121406/