自定义帮助方法上的“未定义方法”

时间:2013-06-15 07:53:53

标签: ruby-on-rails-3 actionmailer helper

我的 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) %>

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

2 个答案:

答案 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中是私有的,因此子类无法访问它。你应该把它放在你班级的受保护或公共部分。

相关问题