繁体   English   中英

Ruby on Rails ActionView :: Template :: Error

[英]Ruby on Rails ActionView::Template::Error

我正在关注Ruby on Rails教程,并遇到一条错误消息,该错误消息完整地指出: 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_controllercreate操作产生,如:

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中。 网址的格式为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

当我使用Web应用触发密码重置时,出现了一个稍微不同的错误,因为它是ActionController::UrlGenerationError in PasswordResets#createActionController::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 = ....类的东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM