Ruby on rails Heroku使用自定义函数部署Ruby on Rails应用程序

Ruby on rails Heroku使用自定义函数部署Ruby on Rails应用程序,ruby-on-rails,sqlite,postgresql,ruby-on-rails-3.1,heroku,Ruby On Rails,Sqlite,Postgresql,Ruby On Rails 3.1,Heroku,我设计了一个RubyonRails3.2应用程序,其中有一个用户模型。我编写了一个自定义函数,以便通过另一个移动应用程序验证用户名和密码。 在localhost中一切正常,我能够从移动应用程序进行身份验证。所以,我更进一步,在Heroku部署了它。现在,身份验证功能不起作用 在我的Gem文件中我包含了以下内容: group :production do gem 'pg' end group :development do gem 'sqlite3' end match 'user

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

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

group :production do
  gem 'pg'
end

group :development do
  gem 'sqlite3'
end
  match 'users/authenticate' => 'users#authenticate', :as => :authenticate
  match 'users/saveUser' => 'users#saveUser', :as => :saveUser

  resources :users

  resources :festivals

  root :to => 'users#index'
在myusers\u 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
在myroutes.rb中,我包括以下内容:

group :production do
  gem 'pg'
end

group :development do
  gem 'sqlite3'
end
  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
create table t ("userName" text);
insert into t values ('x');
select * from t where username = 'x';
这将导致Rails向数据库发送如下SQL:

create table users (
    "userName" varchar(255),
    ...
)
注意
用户名
标识符周围的引号;引号使该列名区分大小写。但是,PostgreSQL中不带引号的标识符被折叠成小写(SQL标准说是大写,但这在这里并不重要)。基本上,引号意味着您在引用该列时必须始终说
“userName”
,不能说
userName
userName
或其他任何内容

另一方面,SQLite对SQL的解释非常松散,因此您可以这样做:

t.string :userName
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])
没有引用您的
用户名
标识符,因此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之上开发。开发堆栈和部署堆栈应该相同(或尽可能接近相同)

  • 你说不工作是什么意思?你的日志怎么说?如果没有日志文件和产生的错误,我们什么都做不了。