1

ユーザーモデルを持つRuby on Rails 3.2アプリケーションを設計しました。別のモバイル アプリケーションを介して userName とパスワードを認証するために、カスタム関数を作成しました。すべてが 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])

次の 2 つのことを行う必要があります。

  1. 大文字と小文字が混在する列名の使用を停止します。単語を区切るためにアンダースコアを使用した小文字の列名とテーブル名は、PostgreSQL (および Ruby と Rails) での通常の方法です。
  2. Heroku にデプロイする場合は、SQLite での開発をやめ、PostgreSQL での開発を開始してください。開発スタックとデプロ​​イ スタックは同じ (またはできるだけ同じに近い) 必要があります。
于 2012-08-11T14:37:55.807 に答える