ruby-on-rails - 具有自定义功能的 Ruby on Rails 应用程序的 Heroku 部署

标签 ruby-on-rails sqlite postgresql ruby-on-rails-3.1 heroku

我设计了一个 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",不能说 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 之上进行开发。您的开发堆栈和部署堆栈应该相同(或尽可能接近相同)。

关于ruby-on-rails - 具有自定义功能的 Ruby on Rails 应用程序的 Heroku 部署,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11914208/

相关文章:

postgresql - 是否有 citus 不支持的功能的解决方法?

ruby-on-rails - Rails 和 CanCan : If user is logged in then allow him/her to view index page?

ruby-on-rails - Ruby on Rails - 帮助向应用程序添加徽章

javascript - AJAX post请求,包含数组和其他对象的对象,无法正确解析到rails中

android - 获取 SQLiteException 并且我不确定是什么原因造成的

Java从sqlite检索数据返回对象而不是值

ruby-on-rails - 使用 capistrano 部署时未找到错误命令 webpack

c - sqlite3编程在Linux C中得到 "out of memory"

postgresql - 无法启动 docker 容器, "docker ps -a"STATUS = Exited (1)

postgresql - 使用运算符 "||"或 format() 函数连接字符串