2

我的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 未定义方法 `email_confirmation_path' for #<#:0x6340ff53>

你能建议吗?

编辑:

您可以在下面找到流程工作流程:

首先,当创建用户时,执行以下行

@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) %>

但我得到它未定义的错误。

4

2 回答 2

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

之后,您将能够在邮件程序的视图中使用该帮助程序。

ps 还注意到,privateRuby 中的修饰符不会将对方法的访问限制为仅对定义它的类。子类也可以调用它。Private意味着一个方法不能相对于这样的对象调用,obj.my_method而只能相对于self这样的对象隐式调用my_method

于 2013-06-15T13:41:31.573 回答
1

该方法在 ApplicationController 中是私有的,因此子类无法访问它。你应该把它放在你班级的受保护或公共部分。

于 2013-06-15T09:12:25.797 回答