2011-12-18 3 views
1

Я довольно новичок в рубине (и использую Rails) и задавался вопросом, можно ли привести следующий метод. В его нынешнем состоянии он действительно работает, однако у меня возникает ощущение, что есть гораздо лучший способ его написать и хотелось бы узнать больше о синтаксисе.Можно ли убрать этот рубиновый метод?

def fullAddress 
    full = self.address1 + "</br>" 
    if self.address2.blank? 
    else 
    full = full + self.address2 + "</br>" 
    end 
    if self.address3.blank? 
    else 
    full = full + self.address3 + "</br>" 
    end 
    full = full + self.posttown + "</br>" + self.postcode 
end 

каждый «сам» будет иметь ADDRESS1, posttown и почтовый индекс, но address2 и address3 не являются обязательными и должны быть добавлены только к fullAddress, если они присутствуют (т.е. ни ноль или пробел).

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

+2

если у вас есть только код для блока еще вы должны свести на нет с 'если condition' или не эквивалент' если condition' – tokland

ответ

12
def full_address 
    [address1, address2, address3, posttown, postcode].reject{|l| l.blank?}.join('</br>') 
end 
+2

Ничего, я не знал об отказе раньше (напротив выбора). – Dorian

+2

Но это слишком сильно отличается от оригинала в семантике, в зависимости от состояния данных, может получиться совершенно другой результат. – clyfe

+1

или отклонить (&: blank?) Или выбрать (&: present?). Или присоединитесь (tag (: br)) – tokland

5

Мое мнение:

def fullAddress 
    full = [address1] 
    full << address2 unless address2.blank? 
    full << address3 unless address3.blank? 
    full << posttown << postcode 
    full.join "</br>" 
end 

self подразумевается в вызове метода, и немного жонглирование с массивами.

+0

хорошая вещь! что вам нужен только один массив – maprihoda

1
def fullAddress 
    full = address1 + "<br>" 
    full += address2 + "<br>" unless address2.blank? 
    full += address3 + "<br>" unless address3.blank? 
    full += posttown + "<br>" + postcode 
end 
0

Вот еще одно решение:

def full_address 
    [address1, 
    address2, 
    address3, 
    posttown, 
    postcode].inject("") do |full_addr, line| 
    full_addr << line + '<br/>' unless line.blank? 
    full_addr 
    end.chomp('</br>') 
end 

Это нужно всего один массив, и сразу же начинается строительство строки. Он должен отлично работать для коротких строк (а полные адреса - короткие строки).

1

Это делает точно так же, как ваш код:

def full_adress 
    ([address1] + 
    [address2, address3].reject(&:blank?) + 
    [posttown, postcode] 
).join("<br/>") 
end 
Смежные вопросы