2014-03-26 3 views
0

나는 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의 테이블은 postsuser_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_fromPundit::NotAuthorizedError에서 경고 메시지입니다.

블로그 게시물에있는 PostPolicyowned 방법으로 로직 변경을 시도했지만 작동하지 않았습니다.

이러한 모델과 스키마를 사용하면 보석을 사용하지 않고이 간단한 승인 (게시물 작성자 만 자신의 게시물을 편집하고 삭제할 수 있어야합니다)을 어떻게 얻을 수 있습니까?

나는 다른 비슷한 질문을 여기에서 시도했지만 아무도 나를 위해 일하지 못했습니다. 내 승인이 작동으로, 지금은 포스트 만 저자가 편집을 표시하고 자신의 게시물에 대한 링크를 삭제해야 게시물 index.html.erb

에 대한 views 특히 editdestroy 링크를 사용자 정의 고군분투

.

다음은 정책 방법을 사용하여보기를 사용자 지정하는 경우 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 %> 

의 코드입니다 방법은 viewcontroller입니다.

은 나에게는 내가 게시물에 USER_ID 필드가 NoMethodError in Posts#indexundefined method user_id for <Class:0x22d64d8>

을 제공합니다. 나는 그 user_id를 가져 오기위한 정책으로 @post를 전달해야한다고 생각한다. 다른 방법을 시도했지만 성공하지 못했습니다.

+1

응용 프로그램 컨트롤러 코드와 게시 정책을 확인하는 것이 유용 할 것입니다. 또한 여기있는 컨트롤러에는 사용자 생성시 게시자를 할당하는 방법이 나와 있지 않으므로 데이터베이스를 확인하고 생성 한 게시물에 user_id가 할당되어 있는지 확인하십시오. 이것은 당신 문제 일 수 있습니다. –

답변

0

질문을 편집 해 주셔서 감사합니다.

나를 올바르게 안내해 준 앤디에게 감사드립니다. 당신이 말했듯이 user_id 새로운 게시물에 대한 nil했다 만들었습니다. 난 그냥 내 모든 auhtorizations 지금은 잘 작동하고 있습니다

post_policy.rb 

create 방법

def create? 
post.user_id = user.id 
new? 
end 

post.user_id에 현재 사용자의 ID를 할당.

하지만 지금은보기를 사용자 지정하는 데 사용되는 정책 방법으로 고민하고 있습니다. 그에 따라 코드와 함께 질문을 편집했습니다.