1

我正在编写一个 Rails 应用程序,它有一个名为“用户”的模型和一个名为“页面”的模型。用户可以有多个页面,用户也可以授权其他用户查看他们的页面。为了在 Rails 中描述这一点,我使用了 has_many, :through 与我创建的第三个模型“授权”的关系。模型看起来像这样:

class User
  has_many :pages, dependent: :destroy
  has_many :authorizations, dependent: :destroy
  has_many :viewable_pages, :through => :authorizations, :source => 'page'
end

class Page
  belongs_to :user

  has_many :authorizations, dependent: :destroy
  has_many :authorized_viewers, :through => :authorizations, :source => 'user'
end

class Authorization
  belongs_to :page
  belongs_to :user
end

就后端功能而言,这对我来说非常有效。在呈现这些关系并允许客户修改它们时,我有点难过。

我有一个页面控制器,当调用“显示”时,我渲染页面。当我呈现页面时,我还想呈现页面的authorized_viewers 列表并允许用户使用AJAX 命令修改该列表。本质上,我想在“页面”布局中做这样的事情:

<% @authorized_viewers.each do |v| %>
  <li><%= v.email %><%= link_to 'delete', authorization, method: :delete, remote: :true %></li>
<% end %>

我不太确定如何引用授权本身,而不是authorized_viewer。我只想删除关系,而不是用户。我也不确定是否应该为“授权”创建一个控制器,以便创建像“销毁”这样的方法,我可以对其进行修改并赋予它们响应 AJAX 调用的能力。授权只会在“页面”视图上呈现,因此生成带有授权视图的整个脚手架似乎没有意义。解决这个问题的最佳方法是什么?

我意识到这是一个很长的问题。任何见解将不胜感激!

4

1 回答 1

2

在视图中显示授权的一种更简单的方法是(假设您为页面/授权关系使用嵌套路由,否则修改路径参数):

<% @authorizations.each do |authorization| %>
  <li><%= authorization.user.email %><%= link_to 'delete', page_authorization_path(@page, authorization), method: :delete, remote: :true % </li>
<% end %>

如果您要直接针对该对象执行操作(例如创建/销毁),最好为授权创建一个控制器。如果总是通过 AJAX 完成,则不必创建任何视图。这使您的所有功能都井井有条,并确保任何与授权相关的交互都驻留在授权控制器中。避免创建脚手架,而只需使用两个操作创建控制器:createdestroy

于 2012-06-11T23:03:47.997 回答