3

私はレールの初心者であり、この問題に対する多くの提案された回答を調べてきました。答えを翻訳できないようです。自分の状況を見てきました。誰かが親切にそれに光を当ててくれることを願っています。私が懸念している2つのモデルは、ユーザーとプロジェクトです。各ユーザーはプロジェクトを作成できますが、各ユーザーはプロジェクトを管理することもできます。これを可能にするために、管理モデルを使用して 2 つのモデルを接続し、UserProjectの間に 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>
4

1 に答える 1