2014-05-18 2 views
0

나는 현재 사용자에 대한 역할이 전무 경우는, 항상 true를 반환 한 문제 같습니다있다 레일 4.잘못 입증 된 경우에도 도우미 방법이 항상 true 반환

def is_blog_owner?(blog_id) 
    if current_user && blog_id 
     blog = Blog.find_by(id: blog_id) 
     roles = current_user.roles_for_blog(blog) 
     roles.each do |role| 
     if role.role == 'Blog-Owner' 
      true 
     end 
     end 
    end 
    end 

에서 다음 헬퍼 메소드가 있습니다.

현재 작동하는 방식은 현재 사용자가 특정 블로그의 블로그 소유자 역할을하는 경우 true를 반환하는 것입니다.

내가 방문 그래서 경우 (사용자 ID로 1) users/1/blogs/2 내가 편집을보고 그때 난 아직 편집을보고 삭제 로그 아웃 한 사용자 ID 2로 로그인 users/1/blogs/2를 방문하는 방법 이제까지 경우 show.html.erb에 아래 그림과 같이 삭제됩니다 . 나는 그렇게해서는 안된다.

그래서 나는 roles가 설정됩니다 후 binding.pry을 던져 버리고 내가 편집을보고 버튼을 삭제하지 말아야한다는 것을 의미한다이 전무 할 2의 사용자 ID를 하나의 블로그 ID에 사용자 ID 2 roles을 발견,하지만 난 할 수 .. 무슨 일 이니?

<h2><%[email protected]%> Profile</h2> 

<p class="text-muted"> 
    Welcome to your blog porfile page. Here you can manage the blog. You can edit or 
    delete the specific blog. 
</p> 

<% if is_blog_owner?(params[:id]) %> 

    <hr> 
    <h3>Action</h3> 
    <p class="text-muted">You can currently do the following actions: </p> 

    <%= link_to "Edit", edit_user_blog_path(current_user.id, @blog.id), :class => 'btn btn-success' %> | 
    <%= link_to "Delete", user_blog_path(current_user.id, @blog.id), 
    data: { confirm: "This is permenent. Are you sure?" }, 
    :method => :delete, 
    :class => 'btn btn-danger'%> 

<% end %> 

내가해야 내가 <%= is_blog_owner?(params[:id]).inspect했다과 [] 반환 ... OO을 가지고 광고. 거짓을 돌려 보내지 않아야합니까?

+0

레일 4에 익숙하지 않지만 if 문을 통과 할 때 메서드가 false를 반환하지 않습니다 ('true'앞에 반환하면 도움이됩니다 ...).) –

+1

루프에'return'을 사용해야합니다 :'role.role == 'Blog-Owner'이면 true를 반환합니다. 그런 다음 마지막 줄에'false'를 추가하십시오. 따라서 사용자가 소유자 인 경우 메서드가 true를 반환하고 false 인 경우 (루비 메서드는 기본적으로 항상 마지막 행을 반환 함). – markets

답변

2

이 구조는 당신을 위해 문제 :

roles.each do |role| 
    if role.role == 'Blog-Owner' 
     true 
    end 
    end 

그것은 아마도 Array 따라서 항상 실제 값이됩니다 roles의 값을 반환합니다. 블록 내부의 독립형 true은 반환되지 않습니다. 이는 .each의 작동 방식이 아닙니다. 일반적으로 .each을 사용하여 배열의 항목을 처리하거나 각 항목을 기반으로 출력하거나 각 항목을 기반으로 부작용을 수행 할 수 있습니다. 반환 값은 항상 객체이며 블록 내부에서 수행하는 작업과 관련이 없습니다.

대신에, 당신은 당신의 의도에 맞게 보이는 방법 .any?을 사용할 수 roles.each ... 수익률이 호출 된 열거 것을

roles.any? do |role| 
    role.role == 'Blog-Owner' 
    end 
0

귀하의 문제가 - 그래서 기본적으로 당신의 방법은 항상 roles를 반환합니다.

따라서 변경, 그것을 정렬하려면 :

def is_blog_owner?(blog_id) 
    if current_user && blog_id 
    blog = Blog.find_by(id: blog_id) 
    roles = current_user.roles_for_blog(blog) 
    roles.each do |role| 
     if role.role == 'Blog-Owner' 
     return true 
     end 
    end 
    end 
    return false 
end 

을하지만 그것이 무엇을하고 있는지에 대해 더 이해하기 위해 다시 작성하는 것이 좋습니다 수 있습니다. 따라서 현재 사용자가 블로그에 대해 갖는 역할을 살펴보고 '블로그 소유자'가 있으면 true를 반환합니다.

첫째,이를 분리 일부 인증 과정 (CanCan 등) 사용하는 것이 더 좋을 수도 있지만, 당신이 당신의 자신의 방법을 고집한다면 당신은 .detect 그것을 합리화 수 :

def is_blog_owner?(blog_id) 
    if current_user && blog_id 
    blog = Blog.find_by(id: blog_id) 
    roles = current_user.roles_for_blog(blog) 
    roles.detect do |role| 
     role.role == 'Blog-Owner' 
    end 
    end 
end 

이를 반환 블록과 일치하는 열거 자의 첫 번째 요소. 그렇지 않으면 일치하는 요소가 없으면 nil을 반환합니다.

관련 문제