Ruby 在 Rails ActionView::Template::Error
Ruby on Rails ActionView::Template::Error
我正在关注 Rails 教程中的 Ruby,我遇到了一个错误,完整地说:ActionView::Template::Error: No route matches {:action=>"edit", :controller=>"password_resets", :email=>"steve@example.com", :id=>nil}, possible unmatched constraints: [:id]
这与允许用户从表单中重置密码的代码有关。错误指的是路线,所以我将从 routes.rb
:
开始
get 'sessions/new'
root 'static_pages#home'
get '/about', to: 'static_pages#about'
get '/contact', to: 'static_pages#contact'
get '/help', to: 'static_pages#help'
get '/signup', to: 'users#new'
post '/signup', to: 'users#create'
get '/login', to: 'sessions#new'
post '/login', to: 'sessions#create'
delete '/logout', to: 'sessions#destroy'
resources :users
resources :account_activations, only: [:edit]
resources :password_resets, only: [:new, :create, :edit, :update]
错误提到控制器中空白的 edit
操作。重置功能由 password_resets_controller
中的 create
操作生成,例如:
def create
@user = User.find_by(email: params[:password_reset][:email].downcase)
if @user
@user.create_reset_digest
@user.send_password_reset_email
flash[:info] = "Email sent with reset instructions"
redirect_to root_url
else
flash[:danger] = "Email address not found"
render 'new'
end
end
def edit
end
这会使用在表单上提交的电子邮件从数据库中提取用户。然后调用模型中的两个方法来完成重置过程。首先,create_reset_digest
方法创建令牌并更新该用户的属性:
def create_reset_digest
self.activation_token = User.new_token # <- error here; wrong attribute
update_attributes(reset_digest: User.digest(reset_token),
reset_sent_at: Time.zone.now)
end
然后,它发送密码重置邮件:
def send_password_reset_email
UserMailer.password_reset(self).deliver_now
end
在电子邮件中,提到了 edit_password_reset_url
,我认为这是导致此错误的原因。该电子邮件的视图是:
<%= link_to "Password reset", edit_password_reset_url(@user.reset_token,
email: @user.email) %>
此方法获取用户的重置令牌和电子邮件,并将其显示在 url 中,用户可以访问它来重置密码。 url 采用 http://example.com/password_resets/reset_token/edit?email="steve%40example.com"
的形式
该错误表明存在不匹配的约束; [:id]
不匹配 - 事实上,它显示为 nil
。 :id=>nil
是从哪里来的,我怎样才能让它与用户 ID 相匹配?我可以从错误消息中暗示任何其他内容吗?
我在 运行 基本测试时遇到此错误:
test "password_reset" do
@user.activation_token = User.new_token
mail = UserMailer.password_reset(@user)
assert_equal "Password reset", mail.subject
assert_equal ["to@example.org"], mail.to
assert_equal ["noreply@example.com"], mail.from
assert_match "Hi", mail.body.encoded
end
当我使用网络应用程序重置密码时,我收到了一个稍微不同的错误,它是 ActionController::UrlGenerationError in PasswordResets#create
。这突出了 edit_password_reset_url((@user.reset_token, email: @user.email)
方法。我查过这本书,看不出这行是不正确的。
欢迎您提出建议。
你似乎没有设置@user.reset_token
(在link_to
中使用)?我看到类似 self.activation_token = User.new_token
的内容。但不是像 self.reset_token = ....
这样的东西。
我正在关注 Rails 教程中的 Ruby,我遇到了一个错误,完整地说:ActionView::Template::Error: No route matches {:action=>"edit", :controller=>"password_resets", :email=>"steve@example.com", :id=>nil}, possible unmatched constraints: [:id]
这与允许用户从表单中重置密码的代码有关。错误指的是路线,所以我将从 routes.rb
:
get 'sessions/new'
root 'static_pages#home'
get '/about', to: 'static_pages#about'
get '/contact', to: 'static_pages#contact'
get '/help', to: 'static_pages#help'
get '/signup', to: 'users#new'
post '/signup', to: 'users#create'
get '/login', to: 'sessions#new'
post '/login', to: 'sessions#create'
delete '/logout', to: 'sessions#destroy'
resources :users
resources :account_activations, only: [:edit]
resources :password_resets, only: [:new, :create, :edit, :update]
错误提到控制器中空白的 edit
操作。重置功能由 password_resets_controller
中的 create
操作生成,例如:
def create
@user = User.find_by(email: params[:password_reset][:email].downcase)
if @user
@user.create_reset_digest
@user.send_password_reset_email
flash[:info] = "Email sent with reset instructions"
redirect_to root_url
else
flash[:danger] = "Email address not found"
render 'new'
end
end
def edit
end
这会使用在表单上提交的电子邮件从数据库中提取用户。然后调用模型中的两个方法来完成重置过程。首先,create_reset_digest
方法创建令牌并更新该用户的属性:
def create_reset_digest
self.activation_token = User.new_token # <- error here; wrong attribute
update_attributes(reset_digest: User.digest(reset_token),
reset_sent_at: Time.zone.now)
end
然后,它发送密码重置邮件:
def send_password_reset_email
UserMailer.password_reset(self).deliver_now
end
在电子邮件中,提到了 edit_password_reset_url
,我认为这是导致此错误的原因。该电子邮件的视图是:
<%= link_to "Password reset", edit_password_reset_url(@user.reset_token,
email: @user.email) %>
此方法获取用户的重置令牌和电子邮件,并将其显示在 url 中,用户可以访问它来重置密码。 url 采用 http://example.com/password_resets/reset_token/edit?email="steve%40example.com"
该错误表明存在不匹配的约束; [:id]
不匹配 - 事实上,它显示为 nil
。 :id=>nil
是从哪里来的,我怎样才能让它与用户 ID 相匹配?我可以从错误消息中暗示任何其他内容吗?
我在 运行 基本测试时遇到此错误:
test "password_reset" do
@user.activation_token = User.new_token
mail = UserMailer.password_reset(@user)
assert_equal "Password reset", mail.subject
assert_equal ["to@example.org"], mail.to
assert_equal ["noreply@example.com"], mail.from
assert_match "Hi", mail.body.encoded
end
当我使用网络应用程序重置密码时,我收到了一个稍微不同的错误,它是 ActionController::UrlGenerationError in PasswordResets#create
。这突出了 edit_password_reset_url((@user.reset_token, email: @user.email)
方法。我查过这本书,看不出这行是不正确的。
欢迎您提出建议。
你似乎没有设置@user.reset_token
(在link_to
中使用)?我看到类似 self.activation_token = User.new_token
的内容。但不是像 self.reset_token = ....
这样的东西。