Получить текст для отображения, если значение пусто ruby ​​4 undefined метод `first_name ' - PullRequest
0 голосов
/ 05 февраля 2019

я новичок в рельсах, так что, пожалуйста, будьте вежливы

в настоящее время это моя страница показа домов в моей папке просмотров

.wrapper_with_padding
 #house.show
    %h1= @house.title
    %p= number_to_currency(@house.price, :unit => "£")
    %p= simple_format(@house.description)
    Occupied: #{@house.occupied}
    %br/
    Tenant: #{@house.tenant.first_name} #{@house.tenant.last_name}

Хорошо отображается, когда БД содержит значение для tenant_idв модели HOUSES, но когда идентификатор арендатора для записей HOUSE равен нулю, я получаю ошибку ниже.

Отображение C: /Sites/landlord2/app/views/houses/show.html.haml где line #8 поднял:

неопределенный метод `first_name 'для nil: NilClass.

В show есть все-таки изменить

Tenant: #{@house.tenant.first_name} #{@house.tenant.last_name}

, чтобы он мог отображать некоторый текст, если tenant_idпусто?

Спасибо

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Лично я не большой поклонник наполнения представления шаблонной логикой.

Это, вероятно, было бы хорошим местом для использования вспомогательного метода.

В вашем файле house_helper.rb попробуйте создать метод current_tenant, который выглядит примерно так:

  def current_tenant(house)
    if house.tenant 
      "#{house.tenant.first_name} #{house.tenant.last_name}"
    else
      "Vacant"
    end
  end

Кроме того, вы часто делаете что-то вроде отображения полного имени арендатора.Таким образом, может быть полезно добавить метод full_name в модель арендатора, чтобы вы могли использовать его повторно.

  class Tenant
    ...
    def full_name
      "#{first_name} #{last_name}"
    end
    ...
  end

Таким образом, вы можете очистить вспомогательный метод до чего-то простого:

  def current_tenant(house)
    return "Vacant" unless house.tenant 

    house.tenant.full_name
  end

И ваш взгляд также будет очищен до:

.wrapper_with_padding
 #house.show
    %h1= @house.title
    %p= number_to_currency(@house.price, :unit => "£")
    %p= simple_format(@house.description)
    Occupied: #{@house.occupied}
    %br/
    Tenant: #{current_tenant(@house)}
0 голосов
/ 05 февраля 2019

Хей, вы можете просто спросить if @house.tenant.present?, а если не отобразить нужный текст, например, следующий код:

.wrapper_with_padding
 #house.show
    %h1= @house.title
    %p= number_to_currency(@house.price, :unit => "£")
    %p= simple_format(@house.description)
    Occupied: #{@house.occupied}
    %br/
    -if @house.tenant.present?
      Tenant: #{@house.tenant.first_name} #{@house.tenant.last_name}
    -else
      %p= 'Text to display if tenant is blank'
...