I’m writing a simple test checking to see if my controller works, however my tests keep returning
3) PasswordResetsController for checking update succeeds
Failure/Error: put :update, id: @user.password_reset_token
TypeError:
can't convert Symbol into Integer
# ./app/controllers/password_resets_controller.rb:23:in `update'
# ./spec/controllers/password_resets_controller_spec.rb:52:in `block (3 levels) in
<top (required)>'
My tests are as follows…
describe PasswordResetsController do
before do
@user = FactoryGirl.create( :user )
end
context "for checking update succeeds" do
before do
@user.password_reset_token = "gB5KGF-3hC4RNHCK5niz9A"
@user.password_reset_sent_at = Time.zone.now
@user.save!(validate: false)
put :update, id: @user.password_reset_token
end
it { should assign_to(:user) }
it { should respond_with(:redirect) }
it { should redirect_to(signin_path) }
it { should set_the_flash.to("Password has been reset.")}
end
end
Here is a link to my Model https://github.com/thejourneydude/template/blob/master/app/models/user.rb
EDIT: It appears that the problem is originating from my controller. On my local server, I’m returned with
TypeError in PasswordResetsController#update
can't convert Symbol into String
Rails.root: /home/jason/ror/template
Application Trace | Framework Trace | Full Trace
app/controllers/password_resets_controller.rb:19:in `update'
My update action in my controller code is..
def update
@user = User.find_by_password_reset_token!(params[:id])
if @user.password_reset_sent_at && @user.password_reset_sent_at > 2.hours.ago
redirect_to new_password_reset_path, flash: { error: "Password reset has expired" }
elsif @user.update_attributes(params[:user])
redirect_to root_url, flash: { success: "Password has been reset." }
else
render :edit, flash: { error: "Hmm.. something went wrong. Let's try that again." }
end
end
What’s wrong with my code and how do I fix it?
What happens if you change this line:
to:
?
My guess is that you should not be able to call
flash[:error] =in theredirect_tosince assignment in Ruby returns the value being assigned.redirect_torequires a hash as the second parameter, but it is being called as a string.