Development Tip

Rails 바로 가기에서 nil이 아니고 비어 있지 않은지 확인하십시오.

yourdevel 2020. 11. 6. 20:41
반응형

Rails 바로 가기에서 nil이 아니고 비어 있지 않은지 확인하십시오.


내 사용자에 대한 표시 페이지가 있으며 각 속성은 nil이 아니고 빈 문자열이 아닌 경우 해당 페이지에만 표시되어야합니다. 아래에는 컨트롤러가 있으며 @user.city != nil && @user.city != ""모든 변수에 대해 동일한 코드 줄을 작성해야하는 것은 매우 성가신 일 입니다. 나만의 방법을 만드는 데 너무 익숙하지 않지만 어떻게 든 다음과 같은 작업을 수행하는 바로 가기를 만들 수 있습니다 @city = check_attr(@user.city). 아니면이 절차를 단축하는 더 좋은 방법이 있습니까?

users_controller.rb

def show 
  @city = @user.city != nil && @user.city != ""
  @state = @user.state != nil && @user.state != ""
  @bio = @user.bio != nil && @user.bio != ""
  @contact = @user.contact != nil && @user.contact != ""
  @twitter = @user.twitter != nil && @user.twitter != ""
  @mail = @user.mail != nil && @user.mail != ""
end

이 작업을 수행하는 방법이 있습니다.

def show
  @city = @user.city.present?
end

present?NOT-위한 방법 테스트 nil플러스가 콘텐츠입니다. 빈 문자열, 공백 또는 탭으로 구성된 문자열은없는 것으로 간주됩니다.

이 패턴은 매우 일반적이기 때문에 ActiveRecord에는 바로 가기도 있습니다.

def show
  @city = @user.city?
end

이것은 거의 동일합니다.

참고로 테스트 vs nil는 거의 항상 중복됩니다. 이 두 논리적으로 거짓 값은 루비에 : nilfalse. 변수가 literal false일 수 없다면 이것으로 충분합니다.

if (variable)
  # ...
end

이것은 평상시 if (!variable.nil?)또는 if (variable != nil)가끔 나타나는 것 보다 바람직합니다 . 루비는 더 환원주의적인 표현을하는 경향이 있습니다.

당신이 대를 비교하려는 것 한 가지 이유는 nil당신이 할 수있는 트라이 상태 변수가있는 경우이다 true, false또는 nil당신이 마지막 두 상태 사이를 구별 할 필요가있다.


.present 를 사용할 수 있습니까? ActiveSupport에 포함되어 있습니다.

@city = @user.city.present?
# etc ...

이렇게 쓸 수도 있어요

def show
  %w(city state bio contact twitter mail).each do |attr|
    instance_variable_set "@#{attr}", @user[attr].present?
  end
end

비어있는 것이 있는지 테스트하려면 사용할 수 있습니다 .blank?(이는의 반대입니다 .present?).

또한 foo == nil. foo.nil?대신 사용하십시오 .

참고 URL : https://stackoverflow.com/questions/22970057/check-if-not-nil-and-not-empty-in-rails-shortcut

반응형