我正在构建一个非常基本的wiki风格的应用程序,它使用3种模式:用户,Wiki和协作。我的目标是,通过编辑维基页面,用户应该能够将另一个用户作为“协作者”添加到维基。这就是我到目前为止所做的:
class Wiki < ActiveRecord::Base
belongs_to :user
has_many :collaborations
has_many :collaboration_users, through: :collaborations, :source => :user
scope :visible_to, -> (user) { user.role == 'admin' || user.role == 'premium' ? all : where(private: false) }
end
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable, :confirmable
has_many :wikis
has_many :collaborations
has_many :collaboration_wikis, through: :collaborations, :source => :wiki
after_initialize :set_default_role
def set_default_role
self.role ||= 'standard'
end
def upgrade_to_premium
self.update_attribute(:role, "premium")
end
def admin?
role == 'admin'
end
def standard?
role == 'standard'
end
def premium?
role == 'premium'
end
end
class Collaboration < ActiveRecord::Base
belongs_to :user
belongs_to :wiki
end
<%= form_for wiki do |f| %>
<% if wiki.errors.any? %>
<div class="alert alert-danger">
<h4>There are <%= pluralize(wiki.errors.count, "error") %>.</h4>
<ul>
<% wiki.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<%= form_group_tag(wiki.errors[:title]) do %>
<%= f.label :title %>
<%= f.text_field :title, class:'form-control', placeholder: "Enter Wiki name" %>
<% end %>
<div class="form-group">
<%= f.label :body %>
<%= f.text_area :body, rows: 8, class:'form-control', placeholder: "Enter Wiki body" %>
</div>
<% if current_user.role == 'premium' || current_user.role == 'admin' %>
<div class="form-group">
<%= f.label :private, class: 'checkbox' do %>
<%= f.check_box :private %> Private Wiki
<% end %>
</div>
<% end %>
<%= f.submit "Save", class: 'btn btn-success' %>
<% end %>
我的目标是显示所有用户的列表(如果是role == premium或admin),并选择添加或删除作为协作者。有人能指出我正确的方向吗?
谢谢!
答案 0 :(得分:1)
当您将用户添加到Wiki时,作为协作者,您正在创建协作记录。您可以通过&#34; collaboration_user_ids =&#34;维基上的方法:该关联为您提供了这种方法,等等。
例如,您可以通过说
将用户123和用户456添加为wiki 789的协作者@wiki = Wiki.find(789)
@wiki.collaboration_user_ids = [123, 456]
@wiki.save
这将删除或创建适当的协作记录,即删除wiki_id = 789和user_id NOT IN(123,456)的任何协作,并为用户123和用户456创建协作(如果它们已经不存在)。
所以,现在我们知道我们可以通过将他们的id数组传递给@ wiki.collaboration_user_ids来设置协作用户列表,我们只需要设置我们的表单来传递这个数组作为params[:wiki][:collaboration_user_ids]
,我们可以照常调用@ wiki.update_attributes(params [:wiki])。
您可以将此添加到表单中来执行此操作:
<div class="form-group">
<p>Collaborators</p>
<% collaboration_user_ids = @wiki.collaboration_user_ids %>
<%# this should more properly use a variable set in your controller rather than User.all - for example you might want to limit the list of possible collaborators according to some condition %>
<% User.all.each do |user| %>
<div class="user">
<%= check_box_tag "wiki[collaboration_user_ids][]", user.id, collaboration_user_ids.include?(user.id) %>
<%= user.name %>
</div>
<% end %>
</div>