2014-07-26 3 views
2

현재 _header.html.erb 부분의 코드는 application.html.erb에 사용됩니다.많은보기에 사용되는 코드를 넣을 곳

<% current_user.achievements.each do |achievement| %> 
    <li><%= link_to achievement.header_string, polymorphic_path(achievement.achievementable) %></li> 
<% end %> 

current_user.achievements 더 appropriete 대신 컨트롤러에 넣어 것 같다? 하지만 어디에 넣어야할지 모르겠다. 스택 오버플로의 헤더에있는 업적과 비슷하다. 이 코드는 사용자가 로그인 한 경우 모든보기에서 사용됩니다.

답변

1

일단 현재 사용자의 성과를 호출 한 다음에 대한 caches that query 결과를 레일하므로 나는 아무 잘못 귀하의 의견에 current_user.achievements를 사용하여 표시되지 않습니다.

당신이 정말로 어딘가에 넣어하려는 경우 다음 응용 프로그램 컨트롤러 당신이 그것을 설정하려는 어떤 행동

def achievements 
    @acheivements = current_user.achievements 
end 

다음에 필터하기 전에 사용할 수있는 장소입니다

before_filter :achievements, only: [:your_methods] 
1

도우미 메서드로 응용 프로그램 컨트롤러에 넣을 것입니다.

helper_method :achievements 

def acheivements(current_user) 
    current_user.achievements.each do |achievement| 
    <do stuff> 
end 

모든 컨트롤러가 응용 프로그램 컨트롤러에서 상속되므로 어디에서나 호출 할 수 있습니다.

1

TL; DR 그대로두기

두 가지 방법으로 질문에 답변 할 수 있습니다.

  1. 목록을 작성하십시오.), 이것이 partial이 의미하는 것입니다. 그리고 그것을 _header partial에두면 옳은 일을합니다.

  2. current_user.achievements의 호출을 참조하고 있고 데이터베이스 호출을 트리거하는 데 잘못된 위치가 있다고 생각하는 경우 : 예 및 아니오라고 말합니다. 이것은 엄격한 MVC 로직이 다소 덜 엄격한 지점입니다. 필자는 그런 경우를 위해 필터 메소드 나 인스턴스 변수로 컨트롤러를 혼란시키지 않을 것입니다. 내 마음 속에서 볼 때 개체의 어떤 속성과 잠재적으로 어떤 관련 개체를 표시할지 결정할 때보기가 완벽하게 괜찮습니다. 그 이야기에 관여하는 관제사는 필드 레벨에서의 접근 통제와 같은 것을 커버 할 수있다 (권한 부여되지 않은 경우 성취도를 []로 설정). 나는 또한 당신의 버전이 읽기 쉽고 명백한 코드라고 생각한다.

+0

의견을 보내 주셔서 감사합니다. – Pierre