8

私はSOでActiveRecord::DangerousAttributeErrorと他の同様のスレッドを見てきましたが、同じ問題に対処していません。

私はomniauthチュートリアルに従っています:http ://railscasts.com/episodes/235-omniauth-part-1?view = asciicast

Twitterでoauthを介して認証し、ユーザーのデータ(auth)を返すことができます。問題は、このエラーメッセージが原因で、データベース(sqlite3)で作成/保存できないことです。

エラー:

ActiveRecord::DangerousAttributeError in AuthenticationsController#create

create is defined by ActiveRecord
Rails.root: /beta/devise-omniauth1

Application Trace | Framework Trace | Full Trace
app/controllers/authentications_controller.rb:15:in `create'

Authentications_Controller:

  def create
    auth = request.env["omniauth.auth"] 
    current_user.authentications.create(:provider => auth['provider'], :uid => auth['uid'])
    flash[:notice] = "Authentication successful."
    redirect_to authentications_url
  end

モデル:

class Authentication < ActiveRecord::Base
belongs_to :user
end


class User < ActiveRecord::Base
has_many :authentications

  # Include default devise modules. Others available are:
  # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and     :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me
end

このエラーを回避するにはどうすればよいですか?このサイトや他のサイトでグーグルすると、それを修正するために何が起こっているのかを理解するのに役立ちません。ありがとう

4

4 に答える 4

8

同じRailsCastに続いて、これに遭遇しました。

チュートリアルでは、次を実行するように指示されています。

rails g nifty:scaffold authentication user_id:integer \
        provider:string uid:string index create destroy

しかし、私のマシンには気の利いた足場がなく、ただ走った

rails g scaffold authentication user_id:integer \
        provider:string uid:string index create destroy

これは動作が異なります。スタブの「index」、「create」、および「destroy」コントローラー メソッドを作成する代わりに、データベースにフィールドを作成しました。

前述のように、それらを削除すると正常に機能します。

于 2012-06-14T05:14:40.187 に答える
4

質問を締めくくるには、次のコマンドを使用して移行を作成する必要があります。

rails g migration remove_silly_authentication_fields_which_should_not_be_there

これは次のようになります。

class DropSillyControllerAttributes < ActiveRecord::Migration
   def change
      remove_column :authentications, :index
      remove_column :authentications, :create
      remove_column :authentications, :destroy
   end
end

そして、通常の方法で実行します:

rake db:migration

または、次を実行できるはずです。

rake db:rollback

データベースに加えた変更をロールバックするには、次のようにします。

rails d scaffold authentication

すべてのファイルを削除するには、次を実行します。

rails g scaffold authentication user_id:integer provider:string uid:string

そして、他のことを手動で行います

ちなみに私も全く同じことをしました。

于 2012-09-27T02:13:48.833 に答える
4

Activerecord は、データベースの属性名 (create など) の一部が、activerecord/ruby によって提供されるインスタンス メソッドの名前と衝突することを警告しています。

そうでなければ、Rails は属性にアクセスするためにこれらの名前のインスタンス メソッドを作成するため、このような衝突は非常に奇妙なことを引き起こしていました。したがって、アクティブなレコードは、これが起こっていることを警告するために例外を発生させます

于 2012-04-19T15:43:23.347 に答える
1

試してみてください: current_user.authentications.create!

編集

したがって、基本的に問題は、Modal クラスのメソッドと同じ名前の列がテーブルにあることでした。

データベースに create または destroy という名前の列を作成することはできません。

ほとんどの場合、モデル/コントローラーの世代のタイプミスでした。

于 2012-04-19T03:43:33.813 に答える