2013-06-15 2 views
1

У меня есть следующий пользовательский маршрут в моем 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>

Не могли бы вы дать совет?

EDIT:

Ниже вы можете найти рабочий процесс:

Во-первых, когда пользователь создается следующая строка выполняется

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

, но я получаю сообщение об ошибке, что не определено.

ответ

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. также обратите внимание, что модификатор private в Ruby не ограничивает доступ к методу только классу, где он определен. Подклассы также могут назвать это. Private означает, что метод не может быть вызван по отношению к объекту, подобному obj.my_method, но может быть неявным образом вызван по отношению к self так my_method.

+0

Большое спасибо за информацию. – gotqn

1

Метод закрыт в ApplicationController, поэтому подклассы не могут получить к нему доступ. Вы должны поместить его в защищенную или публичную часть своего класса.

+0

Привет, я сделал это публично, и это дает мне ту же ошибку.Кроме того, как я читал, директива helper_method делает метод видимым для всех представлений - http://stackoverflow.com/questions/3992659/in-rails-what-exactly-do-helper-and-helper-method-do – gotqn

+0

вы помещаете объявление помощника из частного раздела? –

+0

Да, я переместил его сразу после «protect_from_forgery» – gotqn

Смежные вопросы