【问题标题】:Can SpineJS url() support Nested Resource in Rails?SpineJS url() 可以支持 Rails 中的嵌套资源吗?
【发布时间】:2011-12-14 14:05:24
【问题描述】:

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

所以现在,我们可以按具体文章列出 cmets: http://localhost:3000/articles/1/comments

但 Spine 只能为帖子请求创建 URL 以创建文章和评论,如下所示:

/articles
/comments

如何为这样的 Ajax 请求制作 Spine 的 url?

/articles/1/comments

我知道我可以覆盖评论模型中的 url() 以检索 cmets,但是创建新记录呢?

我也浏览了源代码,我发现 Spine 的 Ajax 模块中的 create() 方法并不关心 Comment 实例中的自定义 url() 函数。我想要的只是传递 article_id 并将它与我的自定义 url() 函数一起使用来生成 url,然后我可以发布到服务器进行创建。

是否可以不使用我自己的 fork 和修改版 Spine?

顺便说一句:对不起我的英语,希望你们都能理解我想说的:-)

谢谢你和最好的问候,

【问题讨论】:

    标签: javascript ruby-on-rails ruby-on-rails-3 spine.js


    【解决方案1】:

    模型的 url 属性可以是一个值或一个函数。所以你可以这样做:

    class Comment extends Spine.Model
      @configure "comment", "article_id"
      @extend Spine.Model.Ajax
    
      @url: ->
        "articles/#{article_id}/comments"
    

    或类似的东西。 ajax 模块将评估此属性并将其用作构建请求时的资源端点。

    【讨论】:

    • 正如丹尼尔在问题中所说,这不适用于创作。
    • 这对于创建 URL 不起作用,因为 Ajax.getURL 函数传递的是 Comment 模型而不是评论的实例。所以它不知道 article_id 是什么。检查我的答案:)
    【解决方案2】:

    添加

    #= require spine/relation
    

    到 app/javascript/app/views/index.js.cofee

    添加关系扩展

    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'
    

    在javascript控制台中

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

    更多信息在http://spinejs.com/docs/relations

    链接在spinejs模型文档的底部

    【讨论】:

      【解决方案3】:

      我有一个解决方案:

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

      https://github.com/SpoBo/spine

      我做了一个分支,它覆盖了 ajax 模块中 url 的生成方式。这允许创建 url 包含模型实例数据的位。例如:/articles/1/cmets。适用于创建、更新等。

      class App.Post extends Spine.Model 
        @configure 'Post', 'channel_id', 'title' 
        @extend Spine.Model.Ajax 
      
        resourceUrl: -> 
          "channels/#{@channel_id}/posts" 
      
        @hasOne 'channel', 'App.Channel' 
      

      【讨论】:

        【解决方案4】:

        我有同样的问题,因为这似乎是 Spine 的最大问题之一。

        由于 BackBone 的简单性,它的实现相当简单,但 Spine 的内部结构非常复杂,因此非常困难。

        如果我有解决方案,我正在尝试实施立场。

        【讨论】:

        • 你不会碰巧有解决方案吧? :p
        【解决方案5】:

        以下代码对我有用,但它没有......(我修改了这个答案)。所以这不是一个好的解决方案,因为 Ajax 请求由 Spine 排队。它总是适用于第一个评论,但不适用于后续调用,因为对 super 的调用会在没有发送 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 = "?"
        

        【讨论】:

          猜你喜欢
          • 2023-03-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多