2013-10-02 60 views
0

我在跟着#275 Railscasts of Ryan Bates,但由於password_reset_token存在問題,我無法通過測試。沒有路線匹配[GET]「/ password_resets/edit」

下面是測試:規格/請求/ 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" 

當我click_button(t('submit.reset.password'))後添加puts user.password_reset_token,我看到了字符串是零。但我不明白爲什麼,你能幫我嗎?

這裏是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控制器createedit方法:

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 
+0

你會發布'rake routes'的輸出嗎? –

回答

0

你需要一個user.reload後您的通話click_button做。令牌已寫入數據庫,但在您的示例中User的實例是與您的模型中的實例不同的Ruby對象。