2015-10-11 3 views
2

У меня есть регистрация, где я хочу отправить пользователю электронную почту. Однако у меня есть вложенный атрибут, в котором пользователь принадлежит компании.UrlGenerationError missing required keys [: id]

ошибка:

CompaniesSignupTest#test_valid_signup_information: 
ActionView::Template::Error: No route matches {:action=>"edit", :controller=>"account_activations", :email=>"[email protected]", :id=>nil} missing required keys: [:id] 

Сейчас это работает:

def create 
log_in @company.users.first 
redirect_to root_path 
end 

Однако, когда я пытаюсь отправить по электронной почте:

def create 
UserMailer.account_activation(@company.users.first).deliver_now 
redirect_to root_url 
end 

я получаю сообщение об ошибке, где он говорит, что это может» t найти идентификатор. Который я нахожу странным, так как он может найти идентификатор в журнале, но не здесь.

Вот параметры запроса:

"company"=>{"users_attributes"=>{"0"=>{"first_name"=>"eorkge", 
"last_name"=>"okerogkeogk", 
"email"=>"[email protected]", 
"password"=>"[FILTERED]"}}, 
"name"=>"oekgoekg"}, 
"commit"=>"Create Company"} 

и маршрут:

<%= link_to "Activate account", edit_account_activation_url(@user.activation_token, 
               email: @user.email) %> 

и отправители/user_mailer:

def account_activation(user) 
    @user = user 
    mail to: user.email, subject: "Account activation" 
    end 

маршруты:

resources :account_activations, only: [:edit] 

результаты пучка exec rake routes | Grep account_activation

edit_account_activation GET /account_activations/:id/edit(.:format) account_activations#edit 

примечание: когда я проверяю просмотр почтовик я могу заставить его работать. Это делает URL в текстовом так:

http://localhost:3000/account_activations/qsdBBow-dcKI00Jf3awu5Q/edit?email=demo%40demo.com 

и метод user_mailer_preview является:

def account_activation 
    user = User.first 
    user.activation_token = User.new_token 
    UserMailer.account_activation(user) 
    end 
+0

Не могли бы вы поделиться запись из файла маршрутов для 'edit_account_activation_url' маршрут? – polarblau

+0

сделано, я пошел и обновился! –

+1

Спасибо! Вы пытались передать идентификатор явно? - 'edit_account_activation_url (id: @ user.activation_token, email: @ user.email)' – polarblau

ответ

-1

Как уже упоминалось в предыдущем ответе я написал, что проблема здесь будет то, что вы не присваивающей id пары явно:

edit_account_activation_url(@user.activation_token, email: @user.email) 

в помощнике пути, Rails возьмут прошли объекты и использовать соответствующие атрибуты для формирования маршрута.

Rails - это логическая программа, это не волшебство; он будет искать id и email от @user, на маршруте, который вы отправили.

Потому что вы хотите использовать activation_token вместо id, вы будете лучше, используя следующие:

edit_account_activation_url(id: @user.activation_token, email: @user.email) 

Это должно работать, глядя на как ваш предыдущий вопрос и этот. Ваш предыдущий вопрос также показал объект @user, чтобы иметь идентификатор, таким образом показывая, что ваши мысли об этом не присутствуют, чтобы быть неправильными.

+0

Есть ли сообщение, на которое нужно ответить хэш-значение ключа 'id'? Я все еще получаю жалобу о том, что 'id' является' nil'. –

+0

Какая ошибка вы видите? –

+1

Он оказался «nil», созданным не используя 'self.' при назначении виртуального атрибута (см. [Мой ответ] (http://stackoverflow.com/a/39990052/5353461) на этот вопрос). Почему требуется «я»? Это кажется излишним, но, очевидно, важно. –

-1

Первый аргумент помощнику URL-адреса используется как :id, который не должен быть nil.

Ваш первый аргумент (а именно @user.activation_token) - nil.


Похоже, что ваш код основан на Chapter 11 of the Ruby on Rails Tutorial.

У меня была та же проблема, и для меня nil -hunt дал некоторое просветление. Я изменил:

# Creates and assigns the activation token and digest 
    def create_activation_digest 
    activation_token = User.new_token 
    activation_digest = User.digest activation_token 
    end 

к:

# Creates and assigns the activation token and digest 
    def create_activation_digest 
    self.activation_token = User.new_token 
    self.activation_digest = User.digest activation_token 
    end 

activation_token Равнины является локальным переменным затенением атрибута объекта с тем же именем. Локальная переменная выйдет за пределы области в конце метода create_activation_digest, оставив атрибут объекта нетронутым, а в моем случае - nil.

Чтобы присвоить атрибуту объекта, ruby ​​требует префикс self. имени атрибута.

0

Такая же проблема возникла со мной, и следующее было хорошо.

Вместо того, чтобы просто передавая объект (@instance variable) в link_to помощника, как я сделал бы для регулярного route_path, я явно упомянул :id в route_url.

В вашем случае это будет:

<%= link_to 'Activate account', edit_account_activation_url(id: @user.id) %> 
Смежные вопросы