渲染并链接到“has_many,:through”关联

时间:2012-06-11 21:55:37

标签: ruby-on-rails ruby-on-rails-3 web-applications partial-views

我正在编写一个rails应用程序,其中包含一个名为“User”的模型和一个名为“Page”的模型。用户可以拥有多个页面,用户还可以授权其他用户查看其页面。为了在rails中描述这个,我使用has_many,:通过与我创建的第三个名为'Authorization'的模型的关系。模型看起来像这样:

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

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

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

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

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

我意识到这是一个很长的问题。任何见解都会非常感激!

1 个答案:

答案 0 :(得分:1)

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

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

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