2

私はRailsを初めて使用し、AndroidデバイスからRailsアプリにアカウントを登録するためのサポートを受けたいと思っています。現在、ユーザー登録にDevisegemを使用しています。deviseのトークンを使用してユーザー認証を機能させることができましたが、携帯電話からアカウントを登録する方法に固執しています。

これまでに2つのアプローチを検討しています。私の最初の試みは、MobileRegistrationsControllerと呼ばれる新しいコントローラーを作成し、次のようなcreateメソッドを使用することでした。

class Api::V1::MobileRegistrationsController  < ApplicationController
  respond_to :json

  def create
    @user = User.create!(params[user])
    @user.ensure_authentication_token!

    respond_to do |format|
      format.json { render json: @user }
    end
  end
end

これが私のルートフォルダです。私はこれについてrailscastチュートリアルに従いました:

namespace :api do

  namespace :v1  do
    resources :tokens,:only => [:create, :destroy], :defaults => { :format => 'json' }
    match 'register' => 'mobile_registrations#create', :via => "post", :defaults => { :format => 'json' }
  end
end

ここから、RESTクライアントを使用してPOSTリクエストをに送信しようとすると

localhost:3000/api/v1/register

エラーが発生します

ActionController::RoutingError (uninitialized constant    Api::V1::MobileRegistrationsController):

だから私は根本的に間違ったことをしていると思います。私はグーグルで検索しましたが、おそらくDeviseセッションコントローラーをオーバーライドする方が良い方法ですか?誰かがこれを経験したことがありますか、それは役立つかもしれませんか?

ありがとう!

更新:だから私は新しいルートを試しています。これをルートフォルダに追加します

devise_scope :user do
   match "api/v1/register" => "devise/registrations#create"
end

これにPOSTリクエストを送信しようとすると。別のエラーが発生します:

WARNING: Can't verify CSRF token authenticity

これは私が以前持っていたものよりも優れていると思います。だから今、私は自分のRails認証トークンを取得する方法を理解する必要があります。

4

1 に答える 1

2

大丈夫。だから私はそれを理解することができました。誰かがこれに遭遇し、同じ問題を抱えている場合に備えて。それは私のコードのいくつかのバグの組み合わせだったようです。

「初期化されていない定数」エラーはコントローラーの名前が適切でないことが原因であると思われるため、コントローラーの名前を変更しました。わかりやすくするために、コントローラーの名前をRegistersControllerに変更しました。これでルーティングエラーが修正されました。

これにより、CSRFトークンである新しいバグが発生しました。次の行を追加しました:

skip_before_filter:verify_authenticity_token、:only =>:create

これはverifyメソッドをスキップしました。これは私にとって非常に曖昧です。アプリに脆弱性が追加されると考えているので、誰かがこれに対するより良い解決策を持っている場合は、私に知らせてください。

そのため、その後、createメソッドに次のような新しいバグが残りました。

検証に失敗しました:メールを空白にすることはできません、パスワードを空白にすることはできません

これを修正するために、createメソッドを次のように変更しました。

@user = User.create!(:email => params [:email]、:password => params [:password]、:password_confirmation => params [:password_confirmation])

また、json応答を変更して、Androidアプリに共有設定として保存する信頼性トークンを含めました。

format.json {render:status => 200、:json => {:token => @ user.authentication_token、:user =>@user}}

于 2012-11-30T20:48:04.800 に答える