2011-12-14 37 views
7

Đường ray có Tài nguyên lồng nhau trong một thời gian và nó đã bị sử dụng nặng nề (hoặc bị lạm dụng). Giả sử chúng ta có hai mô hình, Điều và chú thích.Có thể SpineJS url() hỗ trợ Tài nguyên lồng nhau trong Rails không?

class Article < ActiveRecord::Base 
    has_many :comments 
end 

class Comment < ActiveRecord::Base 
    belongs_to :article 
end 

Xác định tài nguyên lồng nhau trong routes.rb

resources :articles do 
    resources :comments 
end 

Vì vậy, bây giờ, chúng ta có thể liệt kê ý kiến ​​của bài viết cụ thể: http://localhost:3000/articles/1/comments

Nhưng cột sống chỉ có thể làm cho url cho bài yêu cầu để tạo ra Điều và nhận xét như sau:

/articles 
/comments 

Làm thế nào để làm cho url của Spine cho yêu cầu Ajax như thế này?

/articles/1/comments 

Tôi biết tôi có thể ghi đè url() trong Mô hình nhận xét để nhận xét, nhưng tạo hồ sơ mới thì sao?

Tôi cũng đi qua mã nguồn, điều tôi thấy là phương thức create() trong mô-đun Ajax của Spine không quan tâm đến hàm url() tùy chỉnh trong trường hợp chú thích. những gì tôi muốn là chỉ cần vượt qua article_id và sử dụng nó với url tùy chỉnh của tôi() chức năng để tạo ra url, sau đó tôi có thể gửi đến máy chủ để tạo ra.

Có thể không có ngã ba và phiên bản sửa đổi của cột sống không?

btw: xin lỗi vì tiếng Anh của tôi, mong tất cả các bạn có thể hiểu những gì tôi muốn nói về :-)

Cảm ơn bạn Trân trọng,

Trả lời

2

sở hữu url của mô hình có thể là một giá trị hoặc một hàm. Vì vậy, bạn có thể làm:

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

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

hoặc tương tự. Mô-đun ajax sẽ đánh giá thuộc tính này và sử dụng nó làm điểm kết thúc tài nguyên khi xây dựng các yêu cầu.

+0

Như Daniel nói trong câu hỏi, điều này không có tác dụng cho việc tạo. – Pelle

+0

Tính năng này không hoạt động để tạo URL vì chức năng Ajax.getURL được chuyển qua mô hình Nhận xét và không phải là một thể hiện của nhận xét. Vì vậy, nó không có đầu mối những gì một article_id là. Kiểm tra câu trả lời của tôi :) – SpoBo

0

Tôi có cùng một vấn đề vì điều này có vẻ là một trong những vấn đề lớn nhất với cột sống.

Sẽ khá dễ dàng khi thực hiện với BackBone do đơn giản, nhưng nội bộ của Spine khá phức tạp khiến cho việc này trở nên khá khó khăn.

Tôi đang cố gắng triển khai chân đế sẽ quay lại nếu tôi có giải pháp.

+0

bạn sẽ không xảy ra để có một giải pháp nào được không? : p – SpoBo

2

thêm

#= require spine/relation 

để ứng dụng/javascript/app/views/index.js.cofee

để thêm phần mở rộng mối quan hệ

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' 

trong javascript console

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

thông tin trong http://spinejs.com/docs/relations

liên kết là ở dưới cùng của tài liệu mô hình spinejs

2

tôi có giải pháp:

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

https://github.com/SpoBo/spine

tôi đã thực hiện một ngã ba đó sẽ ghi đè cách của url được tạo ra trong các mô-đun ajax. Điều này cho phép tạo url để chứa các bit của dữ liệu cá thể của mô hình. Ví dụ:/bài viết/1/ý kiến. Hoạt động với việc tạo, cập nhật, v.v.

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

Sau bit mã đã làm việc cho tôi NHƯNG thì không ... (và tôi đã sửa đổi câu trả lời này). Vì vậy, đây không phải là một giải pháp tốt vì các yêu cầu Ajax được xếp hàng đợi bởi Spine. Nó luôn luôn làm việc cho một bình luận đầu tiên nhưng không phải cho các cuộc gọi tiếp theo kể từ khi cuộc gọi đến siêu sẽ trở lại mà không cần gửi 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 = "?" 
Các vấn đề liên quan