Я пытаюсь создать веб-приложение, в котором у пользователей есть панель инструментов, где они могут выбрать несколько виджетов. У меня есть следующие многие ко многим:
class CreateWidgets < ActiveRecord::Migration
def change
create_table :widgets do |t|
t.string :name
t.timestamps null: false
end
create_table :users_widgets, id: false do |t|
t.belongs_to :user, index: true
t.belongs_to :widget, index: true
end
end
end
С моделью пользователей, определенной гемом разработки. Итак, как я могу наиболее эффективно настроить некоторые параметры, которые позволят мне определить возможность пользователей видеть только те виджеты, на которые они «подписаны».
Разрешения CanCan определяются здесь:
class Ability
include CanCan::Ability
def initialize(user)
can :read, Widget, :user_id => user.id
end
end
Очевидно, это не работает, так как нет параметра для отслеживания того, какой пользователь создал виджет. Итак, как мне настроить модели виджета/пользователя? Возможно, добавить список прав в пользовательскую модель? Это может быть целая куча логических атрибутов, по одному для каждого типа виджета, но, очевидно, это может немного запутать, как мне решить эту проблему с точки зрения безопасности?
Обновлять:
Мои модели теперь читают:
class User < ActiveRecord::Base
has_many :subscriptions
has_many :widgets, through: :subscriptions
end
class Widget < ActiveRecord::Base
has_many :subscriptions
has_many :users, through: :subscriptions
end
class Subscription < ActiveRecord::Base
belongs_to :user
belongs_to :widget
# make sure you add a unique DB index as well.
validates_uniqueness_of :user_id, scope: :widget_id
end
и мой файл model/ability.rb
гласит:
class Ability
include CanCan::Ability
def initialize(user)
can :read, Widget do |widget|
widget.subscriptions.where(user: user).any?
end
end
end
Но это все еще не работает, я полагаю, это связано с примечанием об уникальном индексе БД, но я не уверен, что добавить для этого?
subscriptions
. Вы бы добавили один сadd_index(:subscriptions, [:user_id, :widget_id], unique: true)
. robots.thoughtbot.com/the-perils-of-uniqueness-validations 29.02.2016belongs_to :creator, class: 'User'
иcreator_id
в виджет (вы можете называть его как хотите). 29.02.2016can
. Я не уверен, как помочь вам больше, поскольку у вас нет очень последовательного описания того, как вы на самом деле хотите, чтобы логика аутентификации работала. 01.03.2016