私はレールの初心者であり、この問題に対する多くの提案された回答を調べてきました。答えを翻訳できないようです。自分の状況を見てきました。誰かが親切にそれに光を当ててくれることを願っています。私が懸念している2つのモデルは、ユーザーとプロジェクトです。各ユーザーはプロジェクトを作成できますが、各ユーザーはプロジェクトを管理することもできます。これを可能にするために、管理モデルを使用して 2 つのモデルを接続し、UserとProjectの間に has_many :through 関係を作成しました。
user.rb
has_many :managings, foreign_key: "manager_id", dependent: :destroy
has_many :managed_projects, through: :managings
管理.rb
belongs_to :manager, class_name: "User"
belongs_to :managed_project, class_name: "Project"
project.rb
has_one :reverse_managing, foreign_key: "managed_project_id",
class_name: "Managing",
dependent: :destroy
has_one :manager, through: :reverse_managing, source: :manager
ですから、私には「ビギナー」という役割があります。プロジェクトのマネージャーになることを選択した人を除いて、初心者はプロジェクトを読むことしかできません。マネージャは、自分が管理しているプロジェクトを編集および更新することも許可されている必要があります。
以下は、これに対する私の試みです。
user ||= User.new # guest user (not logged in)
if user.role? :Admin
can :manage, :all
elsif user.role? :Author
can :read, :all
can [:create], [Project]
can [:edit, :update], Project, :user_id => user.id
elsif user.role? :Beginner
can :read, :all
can [:edit, :update], Project, :manager_id => user.id
end
そのプロジェクトを管理している初心者のプロジェクト ビューを見ると、編集リンクが表示されないため、最後の行が機能していないようです。
ビューで使用するコードは次のとおりです。
<% if can? :update, project %>
<%= link_to 'Edit', edit_project_path(project) %>
<% end %>
これがprojects_controllerに表示されるものです
def edit
@project = Project.find(params[:id])
authorize! :edit, @project
end
誰かがこれで私を助けてくれるなら、私は幸せな男を眠らせます
アップデート
ここが役割?User.rb のメソッド
def role?(role)
return !!self.roles.find_by_name(role.to_s.camelize)
end
アップデート
ユーザーに割り当てられた role_id が間違っていました。これを修正した後、編集リンクを含むプロジェクト ビューを開こうとすると、エラー メッセージが表示されました。
undefined method `manager_id' for #<Project:0xb387f0b0>