0

古いバージョンのアンダースコア (1.2.0) を使用して作成されたバックボーン アプリを、新しいバージョンのアンダースコアが読み込まれた新しい Rails アプリ内で使用しようとしています (現在のバージョンのバックボーンに付属するアンダースコア) -on-rails gem)、これは下位互換性の問題であり、変更ログhttp://underscorejs.org/#changelogを使用してもわかりませんが、しようとしているときに発生していますデータを保存します。

環境:

Companies コレクションによって作成された Company は、それが含まれている Bucket の ID を (setBucket 関数を使用して) 保存しようとしています (以下のコードを参照)。

これは、データを保存しようとしたときに発生するエラーです。

エラー

<error>
    _.extend
    _.clone
    _.extend.toJSON
    _.extend.save
    _.extend.update
    Backbone.sync
    _.extend.sync
    _.extend.save
    window.Company.Backbone.Model.extend.setBucket
    window.AppView.Backbone.View.extend.createCompanyOnEnter
    jQuery.event.dispatch
    elemData.handle.eventHandle

ソースコード

...(コード省略)...

  var company = Companies.create({text: text});    #this works. company is created
  company.setBucket(initialBucket.id);    #this triggers the error

....(コード省略)

setBucket: function(bucketId) {
this.save({bucket: bucketId}, {silent: true});   #the function that's not working
4

1 に答える 1

1

Underscore の 2 つのバージョンを同時に実行できます。最初に Underscore のバージョンをページにロードしてから、次の行を追加します。

var underscore = _.noConflict();

Underscore のバージョンをunderscore変数にエイリアスします (もちろん、必要に応じて別のエイリアスを使用することもできます)。次に、既存のアンダースコアを使用するすべてのコードで検索/置換を実行して、_" underscore" (またはエイリアス) に置き換えます。

最後に、Rails アプリとそのバージョンの Underscore をページにロードします。エイリアスを取得し、_ライブラリのバージョンに影響を与えることなく、コードでそのバージョンを使用できます。

* 編集 *

わかりました、ここでもう少し背景があります。Javascript では (Ruby と同じように) 関数は第一級のオブジェクトです。これは、_技術的にはアンダースコア関数自体ではなく、「真の」アンダースコア関数 (それ自体がオブジェクト) を指す単なる変数であることを意味します。これは、他の変数と同じように、関数にエイリアスを作成できることも意味します。あなたができるのと同じように:var a = 5; var b = aあなたもできるしvar b = _;、それからあなたはb.map()何でもできる。よくほとんど; Underscore は Underscore への内部参照を保持しているため、それを更新する必要がありnoConflictます。そのコードは実際には次のようになっているはずです:var b = _.noConflict();

ちなみに、必要_に応じて、別の方向に移動して を変更できることも意味します_ = alert; _('hello world')

つまり、現在あなたに起こっていることは、ページにアンダースコアを導入することです。<script src='underscore.js'></script>おそらく、メインの html.erb ファイルにを入れてこれを行っていると思われます。これにより、Underscore バージョン #1 が導入されます。次に、Rails アプリをロードします。アプリによって異なるため、これがどのように機能しているのか正確にはわかりませんが、そのアプリはページに別のスクリプト タグを配置し、アンダースコア バージョン #2 を指しています。

Underscore バージョン #2 があなたのバージョン #1 を置き換えただけなので、これは問題です (私が今置き換えたのと同じ方法です_) alert。これにより、コードが壊れます。Railsアプリのタグの後にタグを追加するだけで修正できます。<script>これにより、バージョン #1 が復元され、コードが修正されますが、アプリのコードが破損します。

本当に必要なのは、コードでバージョン #1 を使用し、アプリのコードでバージョン #2 を使用することです。_ここで私の最初の答えが出てきます。バージョン #1 のto underscore(またはその他のもの)を再エイリアス化することで、Rails アプリはバージョン #2 を as として参照し続ける_ことができ、コードはバージョン #1 を as として使用し続けることができますunderscore

于 2013-01-08T04:39:11.987 に答える