我设计了一个 ruby on rails 3.2 应用程序,其中有一个用户模型。我编写了一个自定义函数,以便通过另一个移动应用程序验证用户名和密码。 在 localhost 中一切正常,我可以从移动应用程序进行身份验证。所以,我更进一步,将它部署在 Heroku 中。现在认证功能不起作用。
在我的Gem 文件 中,我包含了以下内容:
group :production do
gem 'pg'
end
group :development do
gem 'sqlite3'
end
在我的 users_controller.rb 中,我编写了自定义的 authenticate 函数:
# 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?我不知道如何去做。请帮帮我伙计们。我真的需要让它工作。提前致谢!
最佳答案
您的 userName
列中可能存在大小写问题。
您使用如下内容创建了您的 userName
列:
t.string :userName
这会导致 Rails 将这样的 SQL 发送到数据库:
create table users (
"userName" varchar(255),
...
)
注意 userName
标识符两边的引号;引号使该列名称区分大小写。但是,PostgreSQL 中不带引号的标识符被折叠成小写(SQL 标准说大写,但这在这里并不重要)。本质上,引号意味着您在引用该列时始终必须说 "userName"
,不能说 username
或 userName
或任何内容否则。
另一方面,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])
你应该做两件事:
- 停止使用大小写混合的列名。使用下划线分隔单词的小写列名和表名是 PostgreSQL(以及 Ruby 和 Rails 的常用做法)。
- 如果要部署到 Heroku,请停止在 SQLite 之上进行开发并开始在 PostgreSQL 之上进行开发。您的开发堆栈和部署堆栈应该相同(或尽可能接近相同)。
关于ruby-on-rails - 具有自定义功能的 Ruby on Rails 应用程序的 Heroku 部署,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11914208/