2011-12-14 19 views
7

Railsにはしばらくの間ネストされたリソースがあり、使用頻度が高い(または過度に使用されています)。 2つのモデル、記事とコメントがあるとします。SpineJS url()はRailsのネストされたリソースをサポートしますか?

class Article < ActiveRecord::Base 
    has_many :comments 
end 

class Comment < ActiveRecord::Base 
    belongs_to :article 
end 

だから今、私たちは特定の記事でコメントを一覧表示することができroutes.rbを

resources :articles do 
    resources :comments 
end 

にネストされたリソースを定義します。 http://localhost:3000/articles/1/comments

をしかし、POSTリクエストを作成するために脊椎はURLのみを行うことができますこのような記事とコメント:

/articles 
/comments 

このようなAjaxリクエストのためのSpineのURLを作る方法は?

/articles/1/comments 

私は、コメントコメント用のコメントモデルでurl()をオーバーライドすることができますが、新しいレコードの作成はどうですか?

SpineのAjaxモジュールのcreate()メソッドは、Commentのインスタンスでカスタムurl()関数を気にしないこともわかりました。私が欲しいのは、article_idを渡してカスタムURL()関数を使ってURLを生成するだけです。作成するためにサーバーに投稿できます。

Spine foのフォークと修正版は自分でできますか?

がところで:私の英語のため申し訳ありませんが、

答えて

2

モデルのurlプロパティは値にすることができ、みんなは私が

は、あなたとよろしくをありがとう:-)について言いたいのか理解することができますあなたのすべてを望みますか、機能。あなたはそうすることができます:

class Comment extends Spine.Model 
    @configure "comment", "article_id" 
    @extend Spine.Model.Ajax 

    @url: -> 
    "articles/#{article_id}/comments" 

またはそれに類するもの。 ajaxモジュールはこのプロパティを評価し、要求を作成するときにリソースのエンドポイントとして使用します。

+0

ダニエルは質問で言うように、これは作成には機能しません。 – Pelle

+0

Ajax.getURL関数がコメントモデルに渡され、コメントのインスタンスではないため、URLの作成には機能しません。したがって、article_idが何であるかの手掛かりはありません。私の答えを確認してください: – SpoBo

0

私はこれがSpineの最大の問題の1つと思われるのと同じ問題があります。

BackBoneは単純さのために実装するのはかなり簡単ですが、Spineの内部構造はかなり複雑で非常に複雑です。

解決策がある場合、私はスタンドを実装しようとしています。

+0

あなたはまだ解決策を持っていないでしょうか? :p – SpoBo

2

アプリ/ javascriptの/アプリ/ビュー/ index.jsに

#= require spine/relation 

を追加します。COFEE

http://spinejs.com/docs/relations

にリンクがspinejsモデルのドキュメント

2

の下部にあるIでJavaScriptコンソールに

App.Project.find(the_id).pages().create({name:"asd"}) 

の詳細情報を関係延長

class App.Project extends Spine.Model 
    @configure 'Project', 'name' 
    @extend Spine.Model.Ajax 
    @hasMany 'pages', 'projects/page' 

class App.Page extends Spine.Model 
    @configure 'Page', 'name', 'content' 
    @extend Spine.Model.Ajax 
    @belongsTo 'project', 'Project' 

を追加します解決策がある:

http://groups.google.com/group/spinejs/browse_thread/thread/6a5327cdb8afdc69?tvc=2

https://github.com/SpoBo/spine

私は、Ajaxモジュールにどのように生成されるかURL年代よりも優先されますフォークを作りました。これにより、create urlにモデルのインスタンスデータのビットを含めることができます。例:/ articles/1/comments。

class App.Post extends Spine.Model 
    @configure 'Post', 'channel_id', 'title' 
    @extend Spine.Model.Ajax 

    resourceUrl: -> 
    "channels/#{@channel_id}/posts" 

    @hasOne 'channel', 'App.Channel' 
0

次のコードは私のために働いていましたが、それはできませんでした(そして私はこの回答を修正しました)。 AjaxリクエストはSpineによってキューに入れられるため、これは良い解決策ではありません。スーパーコールはPUT/POSTを送信せずに戻るため、常に最初のコメントには使用できましたが、その後のコールでは機能しませんでした。

class Comment extends Spine.Model 
    @configure "comment", "article_id" 
    @extend Spine.Model.Ajax 

    # hack for nested: @article_id is only set correctly during save 
    @article_id = "?" 
    @url: =>"/articles/#{@article_id}/comments" 

    save:()=> 
    # hack for nested resources (see @url) 
    Comment.article_id = @article_id 
    super 
    Comment.article_id = "?" 
関連する問題