문제

일부 권장 사항 [1]은 다음을 사용하도록 제안합니다.

<%= current_user.welcome_message %>

대신에

<% if current_user.admin? %>
  <%= current_user.admin_welcome_message %>
<% else %>
  <%= current_user.user_welcome_message %>
<% end %>

하지만 문제는 코드 어딘가에 결정 논리가 있어야 한다는 것입니다.

내 이해는 결정을 내리는 것입니다. template ~보다 낫다 controller 컨트롤러를 더 깨끗하게 만들어줍니다.맞습니까?

이 문제를 처리하는 더 좋은 방법이 있습니까?

http://robots.thoughtbot.com/post/27572137956/tell-dont-ask

도움이 되었습니까?

해결책

내 의견으로는 텍스트가 변경되는 유일한 것일 경우보기에 속하지 않습니다.페이지를 재구성 해야하는 경우, 프리젠 테이션 논리입니다.이렇게하면 이는 단지 데이터가 다릅니다.

다른 팁

당신은 이것이 처음으로 궁금해하지 않습니다. 뷰와 컨트롤러가 논리가 거의 없어야하며 모델은 프리젠 테이션 불가지론이어야합니다. 프리젠 테이션 논리는 어디에 있습니까?

우리는 decorator 패턴 이라는 오래된 기술을 사용할 수 있습니다. 아이디어는 모델 객체를 프리젠 테이션 로직이 포함 된 다른 클래스와 랩핑하는 것입니다. 이 래퍼 클래스를 Decorator 이라고합니다. Decorator는 자신의 프레젠테이션에서 모델을 고립시키는 것을 보관하면서 귀하의 전망에서 논리를 추상화합니다.

Draper dreper 는 데코레이터를 정의하는 데 도움이되는 훌륭한 보석입니다.

당신이 준 샘플 코드는 다음과 같이 추상화 될 수 있습니다 :

컨트롤러의 @user = UserDecorator.new current_user로 뷰에 Decorator를 전달하십시오.

귀하의 데코레이터는 아래와 같이 보일 수 있습니다.

class UserDecorator
  decorates :user

  def welcome_message
    if user.admin?
      "Welcome back, boss"
    else
      "Welcome, #{user.first_name}"
    end
  end
end
.

및 뷰는 단순히 @user.welcome_message 를 포함합니다.

모델 자체에는 메시지를 만드는 논리가 포함되어 있지 않습니다. 대신 Decorator는 모델을 랩핑하고 모델 데이터를 프리젠 테이블 형식으로 변환합니다.

이 도움이되기를 바랍니다!

나는 이것을 위해 도우미를 사용할 것입니다.일부 로케일을 기반으로 환영 메시지를 번역해야한다고 가정 해보십시오.

app/helper/user_helper.rb 쓰기

module UserHelper

  def welcome_message(user)
    if user.admin?
      I18n.t("admin_welcome_message", :name => user.name)
    else
      I18n.t("user_welcome_message", :name => user.name)
    end
  end 

end
.

및보기에서 를 작성할 수 있습니다.

<%= welcome_message(user) %>
.

Decorator / Presenter는 정말 깨끗한 객체 지향 접근 방식을 제공하지만 도우미를 사용하는 IMHO는 훨씬 간단하고 충분합니다.

아니요, 사용자 클래스 나 컨트롤러에서 조건부를 원하지 않습니다.블로그 게시물에 대한 예제의 요점은 다형성, 단지 좋은 구식의 OO 디자인을 참조하는 것입니다.

# in application_controller for example
def current_user
  if signed_in?
    User.find(session[:user_id])
  else
    Guest.new
  end  
end

#app/models/user.rb
class User
   def welcome_message
     "hello #{name}"
   end
end

#app/models/guest.rb
class Guest
  def welcome_message
    "welcome newcomer"
  end
end
.

... 당신은 아이디어를 얻습니다.

프레젠테이션 전용 방법으로 모델을 쓰는 대신 발표자로 작동하는 데코레이터를 만듭니다.

require 'delegate'
class UserPresenter < SimpleDelegator
  def welcome_message
    "hello #{name}"
  end
end
.

및 이제 current_user는 그렇게 보입니다 :

# application_controller
def current_user
  if signed_in?
    UserPresenter.new(User.find(session[:user_id]))
  else
    Guest.new
  end
end
.

사용자 모델을 장식하고 Welcome_Message를 직접 추가하십시오.예, 이것은 어떤 시점에서 어떤 종류의 조건적 인 명령문을 포함 할 수 있습니다.

http://robots.thoughtbot.com/post/14825364877 / 평가 - 대체 장식 - 구현

나는 당신이 답변을 위해 발표자들에게 reilscasts 에피소드를보아야한다고 생각합니다.

논리가 유지하기가 어렵습니다. 모델의 비즈니스 논리를 모델과 모든 뷰 로직을 도우미에 넣어야합니다.

코드를 객체 지향적 인 방식으로 변경하려면 데코레이터 (객체 지향적 인 도우미 방식)를 사용하십시오.

best 예 : https://github.com/jcasimir/draper

정의하는 코드를 넣어라 current_user.welcome_message _app/helpers/application_helper.rb_에서 다음으로 렌더링된 모든 뷰에서 액세스할 수 있습니다. 애플리케이션 공들여 나열한 것.

또 다른 옵션은 관습 주어진 뷰나 컨트롤러와 반드시 연관될 필요는 없는 도우미 모듈(아래 링크된 비디오 참조) include 해당 기능을 포함하려는 뷰/컨트롤러의 모듈에 있습니다.

이것은 흑백이 아닙니다.그러나 설명하신 내용에 따르면 이는 application_controller.rb에 고정하기에는 눈에 띄는 코드이고 자체 컨트롤러를 정당화하는 기능을 갖춘 코드가 아닌 것처럼 들립니다. 가장 효과적이고 효율적인 옵션은 사용자 정의 도우미 모듈을 만드는 것입니다. 해당 기능을 원하는 도우미에 포함하세요.즉, 이는 궁극적으로 애플리케이션 설계자(예: )을 결정해야 합니다.

여기 의 도우미 모듈을 설명하는 좋은 기사입니다. 2011년 5월

여기 이것은 RailsCast 개요입니다. 관습 도우미 모듈(예:특정 컨트롤러나 뷰와 반드시 연관될 필요는 없는 모듈에서와 같이 사용자 정의합니다.짧고, 달콤하고, 요점까지.

해당 항목에 대한 도우미 방법을 정의 할 수 있습니다.나는 그것이 모델에서 환영 문장을 만드는 것이 좋지만 컨트롤러도 좋은 생각이라고 생각하지 않는다.그러나 당신은 당신이 코드에서 깨끗하게 보이게하려고 노력해야합니다. 그리고 당신이 그것을 위해 도우미를 사용할 수 있다면 당신은해야합니다.

좋은 연습은 실제 View 인스턴스를 갖는 것입니다.Rails MVP의 패러디 (차이가 있습니다.) 불행히도 템플릿이라는 척도를 가장하는 것처럼 보입니다.그건 틀렸어.

Views는 MVC 및 MVC 영감 패턴의 프리젠 테이션 로직을 포함해야합니다.또한 다중 템플릿을 조작하고 모델 레이어의 상태 및 정보를 나타내는 템플릿을 사용하는 템플릿을 결정하는 것으로 결정합니다 (예, 모델은 ORM 인스턴스가 아닌 계층입니다).

그래서 질문에 대답하기 위해 프리젠 테이션 로직은 컨트롤러에 아무 곳이지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top