使用form_for将用户添加到Collaboration模型

时间:2015-04-10 11:50:50

标签: ruby-on-rails ruby database

我正在构建一个非常基本的wiki风格的应用程序,它使用3种模式:用户,Wiki和协作。我的目标是,通过编辑维基页面,用户应该能够将另一个用户作为“协作者”添加到维基。这就是我到目前为止所做的:

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.html.erb

<%= 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),并选择添加或删除作为协作者。有人能指出我正确的方向吗?

谢谢!

1 个答案:

答案 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>