나는 ruby
1.9.3 및 rails
4.0.2 및 pundit
0.2.1보석 전문가를 사용하여 왜 글의 저자는 Ruby on Rails 4.0.2에서 글을 편집하거나 삭제할 수 없습니까?
게시물 모델로 구성하여 레일에 안돼서 :
belongs_to :user
사용자 모델은 devise
보석을 사용하여 생성됩니다 (그리고 하지이
devise :database_authenticatable, :registerable,
:rememberable, :trackable, :validatable
) has_many :posts
이 있는가 나는 rake db:drop db:create db:migrate
했다 내 schema.rb
의 테이블은 posts
에 user_id
이되었습니다.
pundit
를 사용하여이 blog을 따랐다. 또한 내 포스트 컨트롤러 액션이 추가 :
def create
@post = Post.new(params[:post].permit(:title, :text))
authorize @post
if @post.save
redirect_to @post
else
render 'new'
end
end
def edit
@post = Post.find(params[:id])
authorize @post
end
def update
@post = Post.find(params[:id])
authorize @post
if @post.update(params[:post].permit(:title, :text))
redirect_to @post
else
render 'edit'
end
end
def destroy
@post = Post.find(params[:id])
authorize @post
@post.destroy
redirect_to posts_path
end
내가 오류의 종류 (NoMethodError
내가 cancan
보석을 사용할 때 내가 가진 같은)을 받고 있지 않다.
그러나 사용자가 아니기 때문에도 게시자가 아니기 때문에 자신의 게시물을 편집하고 파괴 할 수 있습니다.
간단하게는 Couldn't find post
입니다. rescue_from
Pundit::NotAuthorizedError
에서 경고 메시지입니다.
블로그 게시물에있는 PostPolicy
owned
방법으로 로직 변경을 시도했지만 작동하지 않았습니다.
이러한 모델과 스키마를 사용하면 보석을 사용하지 않고이 간단한 승인 (게시물 작성자 만 자신의 게시물을 편집하고 삭제할 수 있어야합니다)을 어떻게 얻을 수 있습니까?
나는 다른 비슷한 질문을 여기에서 시도했지만 아무도 나를 위해 일하지 못했습니다. 내 승인이 작동으로, 지금은 포스트 만 저자가 편집을 표시하고 자신의 게시물에 대한 링크를 삭제해야 게시물 index.html.erb
에 대한 views
특히 edit
및 destroy
링크를 사용자 정의 고군분투
.
다음은 정책 방법을 사용하여보기를 사용자 지정하는 경우 elabs/pundit입니다. 여기
는post_policy.rb
class PostPolicy < Struct.new(:user, :post)
def owned
post.user_id == user.id
end
def create?
post.user_id = user.id
new?
end
def new?
true
end
def update?
edit?
end
def edit?
owned
end
def destroy?
owned
end
end
내 코드입니다 그리고 이것은 우리가 policy
통해 policy
의 인스턴스를 얻을 수 있다고 elabs/pundit에 포스트 학자 문서에 따르면 index.html.erb
<% if policy(Post).edit? %>
<td><%= link_to 'Edit', edit_post_path(post) %></td>
<% end %>
<% if policy(Post).destroy? %>
<td><%= link_to 'Destroy', post_path(post), method: :delete, data: { confirm: 'Are you sure?' } %></td>
<% end %>
의 코드입니다 방법은 view
과 controller
입니다.
은 나에게는 내가 게시물에 USER_ID 필드가 NoMethodError in Posts#index
및 undefined method user_id for <Class:0x22d64d8>
을 제공합니다. 나는 그 user_id를 가져 오기위한 정책으로 @post를 전달해야한다고 생각한다. 다른 방법을 시도했지만 성공하지 못했습니다.
응용 프로그램 컨트롤러 코드와 게시 정책을 확인하는 것이 유용 할 것입니다. 또한 여기있는 컨트롤러에는 사용자 생성시 게시자를 할당하는 방법이 나와 있지 않으므로 데이터베이스를 확인하고 생성 한 게시물에 user_id가 할당되어 있는지 확인하십시오. 이것은 당신 문제 일 수 있습니다. –