nil的未定义方法`name':NilClass

时间:2011-10-08 09:31:47

标签: ruby-on-rails-3

我正在尝试使用电子邮件在“用户”控制器的“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 

如何在网址上获取“电子邮件”而不是“格式”?请有人帮忙吗。

1 个答案:

答案 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 

工作原因是您明确传递了电子邮件参数