기능 개념: REST 작업에 대한 보호된 링크의 뷰 요약

7862 단어 cancan

묘사

나는 보기에 있는 모든 링크 논리가 좀 보기 싫다고 생각해서 재구성을 해서 뚜렷한 모델이 생겼다!
# experiences/show.html.erb
        <%= edit_link(experience) %> 
        <%= destroy_link(experience) %>
# experiences_helper.rb 
  def create_link
    link_to('New', [:create, experience]) if can?(:create, Experience)  
  end

  def edit_link
    link_to('Edit', [:edit, experience]) if can?(:edit, Experience)  
  end

  def delete_link
    link_to('Delete', [:destroy, experience]) if can?(:delete, Experience)  
  end

  def read_link
    link_to('Show', experience) if can?(:read, Experience)  
  end

Not sure if the symbols are all correct in the example above, but still the pattern is there! Reminds me a lot of the Rails framework Hobo where they end up with the same kind of pattern and have it generalized. How would I make all my model helpers have these methods generated and available for my views in a nice and easy fashion. Would make for a nice cancan add-on I think ;)

Looking forward to your next screencast - hoping it is about how to extend devise with cancan :)

토론 #1

I don't think this should go in CanCan, but I think it is a great pattern to follow. considering it's only a few methods it can easily be moved into a helper module. I'll add a wiki page for this. BTW, you can make this more generic like this.

def create_link(object)
  link_to("New", [:new, object]) if can?(:create, object)
end

def edit_link(object)
  link_to("Edit", [:edit, object]) if can?(:edit, object)
end

def delete_link(object)
  link_to("Delete", object, :method => :delete, :confirm => "Are you sure?") if can?(:destroy, object)
end

def show_link(object)
  link_to("Show", object) if can?(:read, object)
end

You'll likely want to customize to fit your needs.

토론 #2

Thanks! I'm adding it to a general authentication-assistance gem, so far targeting devise and cancan. I also added an optional label argument. Was a great 2. screencast about devise, would be could to see one about integrating it with cancan. I'll try that myself today. Maybe post a wiki page about it. Just the same!

토론 #셋

There shouldn't be any necessary steps to integrate with Devise. CanCan only requires a current_user method which Devise already provides. If you do have trouble integrating it, please post an issue.

토론 #4

I am trying to generalize the login and registration menu links in a similar fashion.

<% can? :destroy, Session %>
  
  • <%= link_to('Logout', destroy_admin_session_path) %>
  • <% end %>

    Would be nice with a convenience 'shortcut' for can? and can_not? like this:

    <% can? :sign_out %>
      
  • <%= sign_out_link('Log out') %>
  • <% end %>

    And similarly for :sign_in, :sign_up etc. What do you think? Does it fit inside cancan or should I monkeypatch or extend these methods in my own extension gem?

    토론 #5

    Do you want to restrict who can access the sign-in and sign-out process? Usually those pages should be accessible from everyone and should not go through CanCan. You probably won't need to use CanCan on the controller actions that Devise manages. It should work great for managing everything else in the app though.

    If you do need to manage permissions on the Devise actions then feel free to provide an example and I'll see if there's a good solution.

    토론 #6

    Sorry, I was on autopilot there, creating helepr methods with my mind wandering off... you are totally right!

    토론 #7

    Hi Ryan,

    I am pretty close to having my AuthAssistant working, however I am having severe problems getting link_to to work form within a helper method!!! Please help!

    Trying to add a simple helper method to my views in order to ensure links are only displayed if the user has the proper rights to access that functionality.

      def show_link(object, label = nil) 
        label ||= auth_labels[:show] 
        if can?(:read, object)
          link_to(label, object) 
        end
      end
    
    하지만 이 컨텍스트에서 link 를 사용하므로 내부에서 사용하는 컨트롤러 변수 fx in url for에 액세스할 수 없습니다.
      def url_for(options = {})
        ...
        when :back
          escape = false
          controller.request.env["HTTP_REFERER"] || 'javascript:history.back()'
        else
        ...
      end
    
    만약 내가 show link 방법에서self를 출력한다면, 나는self의 현재 상하문이 ProjectsController라는 것을 볼 수 있다. 그래서ActionController의 실례에서 방법 컨트롤러가 없는 것이 일리가 있다고 생각한다.
    나는 여기서 나의 조수를 방문하는 방법:

    색인html。직원 재교육국


    <%= 링크 항목 표시%>
    및 설정
    정의동작 제어기
    ActionController::Base.교실 평가
    AuthAssistant::ViewHelpers::AuthLink
    끝맺다
    끝맺다

    모듈 Authassistant:: ViewHelpers:: AuthLink

      def self.included(base)  
        base.helper_method :create_link, :delete_link, :edit_link, :show_link
        base.helper_method :new_link, :destroy_link, :update_link, :read_link                        
      end
    
    내가 조수가 아닌 ActionController의 상하문에 누군가를 잘못 넣었나 봐요.길을 잃었어요...

    토론 #8

    Application Controller에 포함시켜야만 작동하지만 이것은 추악한 해커 행위인 것 같다. (
    모듈 ApplicationHelper
    Authassistant 포함::ViewHelpers
    끝맺다
    그리고 제 창설 링크.
      def create_link(object, label = nil)
        label ||= auth_labels[:new]
        link_to(label, [:new, object]) if can?(:create, object)
      end
    
    양식에 링크 만들기http://localhost:3000/projects/new.1
    이상하다

    토론 #9

    링크 조수를 위한wiki 페이지를 만들었습니다.너는 이곳에서 찾을 수 있다.
    http://wiki.github.com/ryanb/cancan/link-helpers

    토론 #10

    wiki에서 언급한create 링크는 IMO에서 사용할 수 없습니다. 다음과 같이 수정해야 합니다.
    def create_link(object, content = "New")
      link_to(content, [:new, object.name.underscore.to_sym]) if can?(:create, object)
    end
    
    그런 다음 다음과 같이 사용합니다.
    이 점을 지적해 주셔서 감사합니다.

    토론 #11

    일까요?나는 실험을 해야 한다.object.class.name.underscore.to_sym아, 잠깐만, 네가 방법 중의 종류를 통과한 걸 봤어.아마도 그것이 같은 종류인지 확인한 후에 행동을 바꿀 수 있을 것이다.때때로 완전한 검사를 수행하기 위해 새로운 실례가 필요하다.

    토론 #12

    비키가 업데이트되었습니다.
    http://wiki.github.com/ryanb/cancan/link-helpers

    토론 #13

    저는 아직 전문가가 아니지만 당신이 묘사한 사례의 장면은 무엇입니까? "때로는 전면적인 검사를 수행하기 위해 새로운 실례가 필요합니다."나는 단지 이 조수에게 그리 복잡한 장면이 아니라는 것을 알고 싶을 뿐이다...

    토론 #14

    링크 조수가 모든 사람에게 적용되는 방식으로 표준화되고 있다는 것을 듣고 매우 기뻤다.
    나는 캐릭터 전략을 프로젝트에 응용하기 위해 캐릭터와 관련된 일련의 보석을 개발해 왔다.
    http://github.com/kristianmandrup/roles_generic
    DM, AR, MM, Mongoid와 같은 공공 궤도 ORM의 역할 정책과 생성기도 있다.그것들은 모두 나의 권한 수여 조수gem에 곧 추가될 것이다.
    http://github.com/kristianmandrup/auth-assistant
    이 보석은 이 모든 새로운 보석을 충분히 활용하여 더욱 간단하고 가볍게 만들기 위해 거대한 재구성 노력을 거칠 것이다.또한 Desive와 같은 링크 지원도 Rails 엔진으로 통합됩니다.
    캔캔을 둘러싼 좋은 포장 구조를 포함하여 권한 논리를 집중하고 모든 역할에 권한 종류를 제공합니다.
    최신 cancan 기능 추가를 반영하기 위해 업데이트가 필요할 수도 있습니다.
    클래스 관리자def 초기화(기능)
    슈퍼
    끝맺다
    def 허가증?(사용자)
    슈퍼
    필요하면 돌아가세요!사용자역할?:관리인
    can:manage,:all
    끝맺다
    끝맺다
    마지막으로 Rails를 사용하여 캐릭터와 권한 시스템을 설정하면 매우 간단하고 유연합니다.

    토론 #15

    @voxik, new/create 작업은 자신이 가지고 있는 기록에 끼워 넣는 등 일부 속성에 의존할 수 있습니다.
    can:create,Task,:project=>{:user_id=>user.id}
    <%= 링크 만들기 @ 프로젝트.임무.구축%>

    좋은 웹페이지 즐겨찾기