1

我设计了一个 ruby​​ on rails 3.2 应用程序,其中有一个用户模型。我编写了一个自定义函数,以便通过另一个移动应用程序验证用户名和密码。在 localhost 中一切正常,我可以从移动应用程序进行身份验证。所以,我更进一步,将它部署在 Heroku 中。现在验证功能不起作用。

在我的Gem 文件中,我包含以下内容:

group :production do
  gem 'pg'
end

group :development do
  gem 'sqlite3'
end

在我的users_controller.rb中,我编写了自定义身份验证函数:

  # http://wgo-ror.herokuapp.com/users/authenticate?userName=ramy&password=123456
  def authenticate     
     usr = params[:userName]
     pwd = params[:password]
     @getUser = User.where("userName = ? AND password = ?", params[:userName], params[:password])     
     if (@getUser!=[])       
       respond_to do |format| 
        format.html { render :json => {:Success => true, :Data => @getUser}, :callback => params[:callback] }
        format.json { render :json => {:Success => true, :Data => @getUser}, :callback => params[:callback] }
       end
     else           
      respond_to do |format|
        format.html { render :json => {:Success => false, :Data => @getUser}, :callback => params[:callback] }
        format.json { render :json => {:Success => false, :Data => @getUser}, :callback => params[:callback] }
      end 
     end
  end

我还编写了另一个名为saveUser的自定义函数。即使在我将它部署到 heroku 之后,这个特定的功能也能正常工作。

  # http://wgo-ror.herokuapp.com/users/saveUser?id=1&userName=yrkapil&password=123456&email=yrkapil@gmail.com  
  def saveUser
     @user = User.find(params[:id])              
     @user.update_attributes(:userName => params[:userName], :password => params[:password], :email => params[:email] )
  end

在我的routes.rb 中,我包含了以下内容:

  match 'users/authenticate' => 'users#authenticate', :as => :authenticate
  match 'users/saveUser' => 'users#saveUser', :as => :saveUser

  resources :users

  resources :festivals

  root :to => 'users#index'

我错过了什么还是因为postgresql?我不知道该怎么做。请帮帮我,伙计们。我真的需要让这个工作。提前致谢!

4

1 回答 1

2

您的userName专栏中可能有案例问题。

您使用以下内容创建了userName列:

t.string :userName

这将导致 Rails 将这样的 SQL 发送到数据库:

create table users (
    "userName" varchar(255),
    ...
)

userName注意标识符周围的引号;引号使该列名区分大小写。但是,PostgreSQL 中不带引号的标识符被折叠成小写(SQL 标准说大写,但这在这里无关紧要)。本质上,引号意味着您"userName"在提及该列时始终必须说,您不能说usernameuserName或其他任何内容。

另一方面,SQLite 对 SQL 的解释非常松散,因此您可以执行以下操作:

create table t ("userName" text);
insert into t values ('x');
select * from t where username = 'x';

一切都会奏效。

每次让 ActiveRecord 构建列名时,它都会引用它,所以:

 @user.update_attributes(:userName => params[:userName], :password => params[:password], :email => params[:email] )

最终会这样做:

update users
set "userName" = ...

每个人都很高兴。但是,您在这里使用的是 SQL 片段:

@getUser = User.where("userName = ? AND password = ?", params[:userName], params[:password])

没有引用你的userName标识符,所以 PostgreSQL 可能在抱怨一个未知的列。如果你这样做:

@getUser = User.where('"userName" = ? AND password = ?', params[:userName], params[:password])

你会有更好的运气。或者你可以这样做:

@getUser = User.where(:userName => params[:userName], :password => params[:password])

或这个:

@getUser = User.where(:userName => params[:userName]).where(:password => params[:password])

你应该做两件事:

  1. 停止使用大小写混合的列名。使用下划线分隔单词的小写列名和表名是 PostgreSQL(以及 Ruby 和 Rails 的常见做法)。
  2. 如果您要部署到 Heroku,请停止在 SQLite 之上进行开发并开始在 PostgreSQL 之上进行开发。您的开发堆栈和部署堆栈应该相同(或尽可能接近相同)。
于 2012-08-11T14:37:55.807 回答