在用户的信息页面上显示特定的HABTM数据

时间:2016-06-29 00:59:16

标签: ruby-on-rails ruby-on-rails-4

我正在创建一个wikpedia模拟器。我的应用有标准用户,高级用户和管理员。高级用户可以创建私人wiki并添加协作者。协作者可以是标准用户。我已将我的协作者迁移设置为具有user_id和wiki_id。我无法弄清楚如何在用户的页面上显示他们是合作者的维基。我已经展示了他们创建的维基 - 这很容易。我已经在我的wiki.rb def collabs中启动了一个方法,我认为应该收集每个用户的协作者信息,但我不知道如何在我的用户显示中使用它.html.erb文件。我对rails非常陌生,我真的只有使用简单的do循环来显示信息的经验。例如,这就是我显示用户wiki的方式:

<% @user.wikis.each do |w| %>
  <%= link_to w.title, w, :class => 'rq-link' %>
    <% if w.private? %>
      <small>(private)</small>
    <% end %>
    <br />
<% end %>

这是我的wiki.rb:

class Wiki < ActiveRecord::Base
  belongs_to :user
  scope :alphabetical, -> { order("title ASC") }
  scope :visible_to, -> (user) { (user.admin? || user.premium?) ? all :where(private: false) }

  has_many :users, through: :collaborators
  has_many :collaborators

  def collaborator_for(user)
    collaborators.where(user_id: user.id).first
  end

  def users
    collaborators.collect(&:user)
  end

  def collabs
    users.collect(&:collaborator)
  end

end

这是m User.rb:

class User < ActiveRecord::Base

  devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable, :confirmable

  has_many :wikis
  has_many :collaborators

  after_initialize :default_role
  enum role: [:standard, :premium, :admin]

  def default_role
    self.role ||= :standard
  end

end

Collaborator.rb:

class Collaborator < ActiveRecord::Base
  belongs_to :user
  belongs_to :wiki
end

协作者表:

class CreateCollaborators < ActiveRecord::Migration
  def change
    create_table :collaborators do |t|
      t.references :user, index: true, foreign_key: true
      t.references :wiki, index: true, foreign_key: true

      t.timestamps null: false
    end
  end
end

1 个答案:

答案 0 :(得分:0)

如果这有助于其他人,这就是我解决问题的方法:

我将以下内容添加到user.rb中:

has_many :wiki_collaborations, through: :collaborators, source: :wiki

然后在我的用户的显示页面上,我显示了:

<% @user.wiki_collaborations.each do |collab| %>
  <%= link_to collab.title, wiki_path(collab), :class => 'rq-link' %>
<% end %>

最终不需要使用collect方法。