Bir kullanıcı ve bir proje arasında bir 'aşağıdaki' ilişkiyi kurmak için bir Projeler ve İlişkiler modelim var. İlişki modelinde enum'u kullanarak 'İlişki' için üç rol belirledim ... bunlar yönetici, ortak çalışan ve ziyaretçi. Bununla birlikte, kullanıcı ve proje arasındaki ilişkinin nasıl kurulduğuna bağlı olarak varsayılan rolü belirlemem gerekir. Aşağıdaki basit senaryolar ihtiyaç vardır:Proje oluşturmaya dayalı olarak Enum'u kullanarak Varsayılan Rolü Ayarlama
(a) bir projeyi yaratan bir kullanıcı otomatik olarak projeye takip ediyor ... İlişki rol projesinin oluşturulduktan sonra 'Yönetici' olarak ayarlanması gerekir
(b) sitenin ziyaretçilerinin sadece proje profil sayfasına gider, onlar tıklayabilirsiniz bir aşağıdaki ilişki kurmak için düğmeye 'izleyin' ... Ancak bu 'ziyaretçinin'
İlişki Modeli İlişki rol belirlesin:
class Relationship < ActiveRecord::Base
belongs_to :follower, class_name: "User"
belongs_to :followed, class_name: "Project"
validates :follower_id, presence: true
validates :followed_id, presence: true
enum role: [:admin, :collaborator, :visitor]
after_initialize :set_default_role, :if => :new_record?
def set_default_role
self.role ||= :admin
end
end
Re lationships Denetleyici:
class RelationshipsController < ApplicationController
before_filter :authenticate_user!
def create
@project = Project.find(params[:relationship][:followed_id])
current_user.follow!(@project)
# relationship.visitor! View railsapps documentation for devise pundit#roles
redirect_to @project
end
def destroy
@project = Project.find(params[:id]).followed
current_user.unfollow!(@project)
redirect_to @project
end
private
def relationship_params
params.require(:relationship).permit(:followed_id, :follower_id)
end
Projeler Kontrolörü
class ProjectsController < ApplicationController
before_filter :authenticate_user!, only: [:create, :new, :edit, :update, :delete, :followers]
def create
@project = current_user.own_projects.build(project_params)
if @project.save
if params[:project][:projectimage].present?
render :crop
else
flash[:success] = "You've successfully created a project..."
redirect_to @project
end
else
render 'new'
end
end
def update
@project = Project.find(params[:id])
if @project.update_attributes(project_params)
if params[:project][:projectimage].present?
render :crop
else
flash[:success] = "Project Created"
redirect_to @project
@project.followers << current_user #this establishes the following relationship as soon as a new project is created between user/project
end
else
render 'edit'
end
end
end
Kullanıcı Modeli:
class User < ActiveRecord::Base
has_many :own_projects, :class_name=>'Project'
has_many :projects
has_many :relationships, foreign_key: "follower_id", dependent: :destroy
has_many :followed_projects, through: :relationships, source: :followed
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
def following?(some_project)
relationships.find_by_followed_id(some_project.id)
end
def follow!(some_project)
self.relationships.create!(followed_id: some_project.id)
relationship.visitor!
end
end
Ne Ya 'yönetici' olarak varsayılan rolü ayarlamak için benim kodda değiştirmeniz gerekir veya yukarıda belirtilen iki senaryodan yola çıkarak 'ziyaretçi'? Yukarıdaki açıklamalarda anlatıldığı gibi
Neden her zaman yeni bir 'İlişki' oluştururken 'rolünü' belirtmiyorsunuz? Farklı koşullar altında (ilişkinin dışında) farklıysa neden varsayılan değerle uğraşmak zorundasınız? – BoraMa
Eğer after_initialize ve set_default_role sözünü belirtildiği gibi kaldırmış olsaydım (ve sadece --onum rolü: [: admin,: collaborator,: visitor]) ... yeni bir proje için bu ilişkiyi 'admin' rolünü nasıl kurabilirim? yaratıldı?Proje denetleyicisinin veya ilişki denetleyicisinin oluşturma eyleminde? thx – BB500
Evet, demek istediğim buydu. İlgili 'rolü' temelde ilişkinin oluşturulduğu her yerde, ör. 'User' içinde' follow! 'yönteminde: self.relationships.create! (followed_id: some_project.id, role:: visitor) 'veya kontrolörlerde. – BoraMa