Ryan Batesの #275 Railscast をフォローしていますが、 に問題があるため、テストに合格できませんpassword_reset_token
。
これがテストです:spec/requests/password_resets_spec.rb
require 'spec_helper'
subject { page }
describe "setting a new password" do
let(:user) { FactoryGirl.create(:user) }
before do
visit new_password_reset_path
fill_in t('user.email'), with: user.email
click_button(t('submit.reset.password'))
visit edit_password_reset_path(user.password_reset_token)
end
it { should have_title(full_title(t('page.title.password_reset.edit'))) }
end
そしてここにエラーメッセージ:
Failure/Error: before { visit edit_password_reset_path(user.password_reset_token) }
ActionController::RoutingError:
No route matches [GET] "/password_resets/edit"
puts user.password_reset_token
afterを追加するとclick_button(t('submit.reset.password'))
、文字列が nil であることがわかります。理由がわかりませんが、助けてもらえますか?
new_password_resetビューは次のとおりです。
<%= form_tag password_resets_path, :method => :post do %>
<div class="field">
<%= label_tag :email, t('user.email') %>
<%= text_field_tag :email, params[:email] %>
</div>
<%= submit_tag t('submit.reset.password'), class: "btn btn-primary" %>
<% end %>
そしてedit_password_resetビュー:
<% provide(:title, t('page.title.password_reset.edit')) %>
<%= form_for @user, :url => password_reset_path(params[:id]) do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<div class="field">
<%= f.label :password, t('user.password') %>
<%= f.password_field :password %>
</div>
<div class="field">
<%= f.label :password_confirmation, t('user.password_confirmation') %>
<%= f.password_field :password_confirmation %>
</div>
<%= f.submit t('submit.update.password'), class: "btn btn-primary" %></div>
<% end %>
そしてnew_password_resetコントローラーcreate
とedit
メソッド:
def create
user = User.find_by_email(params[:email])
user.send_password_reset if user
flash[:success] = t('flash.success.reset_password.sent')
redirect_to root_url
end
def edit
@user = User.find_by(password_reset_token: params[:id])
end
はユーザーモデルsend_password_reset
で定義されます。
def send_password_reset
self.password_reset_token = Digest::SHA1.hexdigest(SecureRandom.urlsafe_base64.to_s)
self.password_reset_sent_at = Time.zone.now
save!(validate: false)
UserMailer.password_reset(self).deliver
end
そしてrake routes
結果があります:
password_resets POST /password_resets(.:format) password_resets#create
new_password_reset GET /password_resets/new(.:format) password_resets#new
edit_password_reset GET /password_resets/:id/edit(.:format) password_resets#edit
password_reset PATCH /password_resets/:id(.:format) password_resets#update
PUT /password_resets/:id(.:format) password_resets#update