Я пытаюсь создать помощника, который будет форматировать адрес из 5 столбцов (add1, add2, add3, add4, add5), чтобы он сжимал любые нули и отображался на экране как таковой
Add1,
Add3,
Add4,
Add5
(добавление 2 было пропущено, так как оно было нулевым)
Я создал следующий помощник для сборки и пропуска любых нулей, но я не могу ввести новый разрыв строки. Любые идеи?
def delivery_address(customer)
@customer = Customer.find(customer.id)
if @customer.del_address1.blank?
deladdress = "No Delivery Address"
else
deladdress = @customer.del_address1
deladdress = deladdress + "</br>"
if customer.del_address2.blank?
else
deladdress = deladdress + @customer.del_address2 + ","
end
if @customer.del_address3.blank?
else
deladdress = deladdress + @customer.del_address3 + ","
end
if @customer.del_address4.blank?
else
deladdress = deladdress + @customer.del_address4 + ","
end
if @customer.del_address5.blank?
else
deladdress = deladdress + @customer.del_address5
end
end
end
Добавьте разрыв строки, например, <br> или возврат каретки.
@ChrisNash <br> и \n - две разные вещи. Какой ты хочешь? Пожалуйста, будьте ясны.
@tomLord Я хочу, чтобы кто-нибудь из них дал мне адресный блок текста в несколько строк. Я попробовал оба в моем помощнике, и ни один из них не работал. Obvs у меня был неправильный синтаксис
Поскольку ваша функция является помощником просмотра, подойдет тег <br/>.
На всякий случай, если это будет полезно, в стандартном многострочном формате адреса USPS нет запятых в конце адресной строки. Если предполагается, что адрес доставки читается так же, как на упаковке для доставки в США, конечные запятые следует опустить. Ссылка -> pe.usps.com/text/pub28/28c2_001.htm





def delivery_address(customer)
@customer = Customer.find(customer.id)
return "No Delivery Address" if @customer.del_address1.blank?
[
@customer.del_address1,
@customer.del_address2,
@customer.del_address3,
@customer.del_address4,
@customer.del_address5
].reject(&:blank?).join(",\n")
end
Вместо того, чтобы писать 5 операторов if, вы можете поместить все значения в массив, а затем удалить все пустые значения.
Обратите внимание, что мой код здесь основан на вашем, но это не совсем то, о чем вы спрашивали:
it will compact any nulls
Пустая строка также считается blank? (но "" != nil). Таким образом, этот метод также пропустит эти значения.
Если вы действительно хотите игнорировать значения nil, но оставить пустые строки, замените reject(&:blank?) на compact.
собирался дать ответ компактным, а не пустым, чтобы соответствовать тому, что спросил OP (нулевые значения), хорошее редактирование
Спасибо, Том, однако на странице это отображается так: 23 Taylor Road <br/> Bradford <br/> BD6 1BH
@ChrisNash Как упоминалось выше, вы можете использовать .html_safe. Без минимальный воспроизводимый пример (т.е. как в данном случае вызывается метод?) Проблемы, у меня не было возможности узнать, было ли это решение полным :)
Один важный совет: вы не должны делать никаких запросов к базе данных внутри помощника представления. Это нужно делать только в контроллере. Активная запись уже должна быть передана во вспомогательную функцию. Итак, эта строка
@customer = Customer.find(customer.id)
можно удалить.
def delivery_address(customer)
# Use a guard clause, this reduces if nesting
return 'No Delivery Address' if customer.del_address1.blank?
# Collect all parts
parts = [customer.del_address1, customer.del_address2, customer.del_address3, customer.del_address4, customer.del_address5]
# Remove all empty parts.
# Using a bang method is lighter on memory allocation
# and will speed up performance.
parts.reject!(&:blank?)
parts.join('<br/>').html_safe
end
Спасибо, но на странице показаны только 5 строк адреса в 1 строке, а не разделены на несколько строк, как я ожидал.
Ах. Я забыл вызов html_safe. Это должно работать сейчас
Я просто перезагрузил страницу, и адрес был идеальным - это радует мое сердце. Спасибо!
Что означает «ввести новый разрыв строки»? Не могли бы вы уточнить?