我正在尝试使用电子邮件在“用户”控制器的“show”操作中找到用户。我在哪里得到这个错误。
NoMethodError in UsersController#show
undefined method `name' for nil:NilClass
现在我使用奇异的资源路线,因为没有单一的资源,我得到的错误就像
Routing Error
No route matches {:action=>"show", :controller=>"users", :id=>#<User name: "sandip", email: "sandip@example.com", address: nil, encrypted_password: "605b20529364629b7668d55006310536", created_at: "2011-10-07 04:23:23", updated_at: "2011-10-07 04:23:23">}
现在我的routes.rb文件看起来像这样。
Demo::Application.routes.draw do
resource :user
resources :sessions, :only => [:new, :create, :destroy]
match '/signout', :to => 'sessions#destroy'
match 'user/:email', :to => 'users#show'
root :to => "sessions#new"
end
通过这条路线,“路由错误”消失了,但是出现了一个新的“NoMethodError”错误。
我的用户控制器(仅与问题相关的部分)
class UsersController < ApplicationController
def show
@user = User.find_by_email(params[:email]) if params[:email].present?
@title = @user.name
end
end
为了使用电子邮件找到用户,我在我的用户模型中添加了一个方法。
我的用户模型(仅与问题相关的部分)
class User < ActiveRecord::Base
def to_param # overridden
"#{email}"
end
end
现在,当用户登录时,浏览器上的网址就是这样。
http://localhost:3000/user?format=sandip%40example.com
我收到“NoMethodError”错误。 但是当我在网址上手动将“格式”更改为“电子邮件”时,一切正常。
http://localhost:3000/user?email=sandip%40example.com
如何在网址上获取“电子邮件”而不是“格式”?请有人帮忙吗。
答案 0 :(得分:0)
路线映射显示
match 'user/:email', :to => 'users#show'
所以适合你的网址就像
http://localhost:3000/user/sandip%40example.com
其中,电子邮件参数将设置为sandip%40example.com
但是,建议不要使用上面的网址格式。
此外,您注册erb / haml的输入元素名称似乎也是“格式”,应该更改为“email”,以便将其作为url参数传递。
http://localhost:3000/user?email=sandip%40example.com
工作原因是您明确传递了电子邮件参数