如何设计在rails中嵌套资源的路由?

时间:2015-08-19 12:05:40

标签: ruby-on-rails

我想创建一个Web应用程序。

  1. 一个用户有很多文章;
  2. 一篇文章有​​很多评论;
  3. 代码如下:

    class User
      .....
      has_many :articles
    end
    
    class Article
     ....
     belongs_to :user
     embeds_many :comments
    end
    
    class Comment
      ....
      embedded_in :article, inverse_of: :comments
    end
    

    我想使用嵌套路线:

    resources :users do
      resources :articles do
        resource :comments do
      end
    end
    

    但Rails指南告诉我们要避免多个嵌套资源。任何人都可以给我一些好主意。提前谢谢!

3 个答案:

答案 0 :(得分:1)

您可以使用resources :users do resources :articles, shallow: true do resources :comments end end 避免深度嵌套。

resources :users do
  resources :articles, only: [:index, :new, :create]
end

resources :articles, only: [:show, :edit, :update, :destroy]
  resource :comments, only: [:index, :new, :create]
end

resource :comments, only: [:show, :edit, :update, :destroy]

它将提供与以下相同的路线:

users/1
users/1/articles
articles/1
articles/1/edit
articles/1/comments
comments/1
comments/1/edit

和这样的网址:

users/1
users/1/articles/1
users/1/articles/1/edit
articles/1/comments
articles/1/comments/1
articles/1/comments/1/edit

你可以在这里阅读更多相关信息http://guides.rubyonrails.org/routing.html#nested-resources并使用它。

如果你想做的更简单,并且有这样的网址(更深的嵌套):

resources users do
  resources :articles
end

resources articles, only: [] do
  resources :comments
end

然后你可以这样做:

window.setInterval(function(){ check(); }, 50);

function check() {

    var content1 = document.getElementsByName("content")[0].contentDocument.body;
    var content3 = document.getElementsByName("content3")[0].contentDocument.body;

    if(isEmpty(content3)) {
            if(isEmpty(content1)) setProperties("0px, *, 0px");
            else setProperties("35%, *, 0px");
    } else setProperties("25%, 40%, 35%");

    window.localStorage.clear();
}

function isEmpty(e) { return (e.offsetWidth!=0 || e.innerHTML!="\n"); }

function setProperties(value) { document.getElementsByTagName("frameset")[1].cols = value; }

祝你好运,玩得开心!

答案 1 :(得分:0)

由于用户和文章之间的关系并不多,因此为每篇文章指定路线及其来自家长的评论将是多余的。

resources users do
    resources :articles
end

resources articles, only: [] do
    resources :comments
end

答案 2 :(得分:0)

是的,你应该避免将更多的资源嵌套在另一个资源中。

你可以这样做:

resources :users do
  resources :articles 
end

而且:

resources :articles do
  resource :comments
end

所以用户有很多文章,文章有很多评论。