Как я могу сделать case-выражение в методе lib / Module более сухим в Rails? - PullRequest
1 голос
/ 02 марта 2011

Ниже приведен метод в lib / Module, который я назвал cron_tasks.rb.

В кейсе указывается:

case quad

when "0"

Затем запускается этот тип кода.

79           #upper-left address
 80            pdf.draw_text contact.first_name + " " + contact.last_name,
 81               :at =>[(pdf.bounds.left + postcard_width - in2pt(2.75)), (pdf.bounds.top - in2pt(2.25))],
 82               :size => 14
 83 
 84            pdf.draw_text contact.address.street1,
 85               :at =>[(pdf.bounds.left + postcard_width - in2pt(2.75)), (pdf.bounds.top - in2pt(2.25) - 20)],
 86               :size => 14
 87 
 88            pdf.draw_text contact.address.city + ", " + contact.address.state,
 89               :at =>[(pdf.bounds.left + postcard_width - in2pt(2.75)), (pdf.bounds.top - in2pt(2.25) - 40)],
 90               :size => 14
 91 
 92            pdf.draw_text contact.address.zip,
 93               :at =>[(pdf.bounds.left + postcard_width - in2pt(2.75)), (pdf.bounds.top - in2pt(2.25) - 60)],
 94               :size => 14

Существует всего лишь небольшое смещение всего этого кода для разных когда:

when 1
....(same code)

when 2
....(same code)

when 3
....(same code)

Есть ли способ сделать все это позиционирование текста более СУХИМЫМ (возможно, self.position в этом модуле?), Чтобы я мог просто передать смещения?

Я печатаю адреса по четыре на большом листе бумаги, так что относительное местоположение одинаковое, мне просто нужно переместить его в каждый из четырех квадрантов.

Важно: трудная задача состоит в том, что когда я пытался использовать self.print_address, мне приходилось передавать так много переменных из основного метода ... фактически, я не смог выяснить, как добавить все они, потому что есть зависимости от других модулей ...

Ответы [ 2 ]

1 голос
/ 02 марта 2011

Я бы использовал Bounding Boxes.Вместо абсолютного позиционирования каждой адресной строки, вы можете просто установить абсолютное положение четырех ограничивающих рамок.

  pdf.bounding_box([(pdf.bounds.left + postcard_width - in2pt(2.75)), (pdf.bounds.top - in2pt(2.25))], :width=>250, :height=>100) do
     pdf.font_size 14
     pdf.text contact.first_name + " " + contact.last_name
     pdf.text contact.address.street1
     pdf.text contact.address.city + ", " + contact.address.state
     pdf.text contact.address.zip
     #pdf.stroke_bounds #use for testing box size
  end

РЕДАКТИРОВАТЬ: при использовании с лямбда

оберните ограничивающую рамку вЛамба, тогда позвони из своего дела.

draw_address = lambda { |contact, x, y| 
  pdf.bounding_box([x, y], :width=>250, :height=>100) do
     pdf.font_size 14
     pdf.text contact.first_name + " " + contact.last_name
     pdf.text contact.address.street1
     pdf.text contact.address.city + ", " + contact.address.state
     pdf.text contact.address.zip
     #pdf.stroke_bounds #use for testing box size
  end
  }

  #use draw_address in your case to populate and position
when 1
  draw_address(contact, 560, 70)
when 2
  draw_address(contact, 240, 70)
when etc...
0 голосов
/ 02 марта 2011

Вы можете просто обернуть повторяющиеся вещи в лямбду, что сразу сделает различия очевидными, и вы избежите повторения:

draw_it = lambda { |str, offset|
    x = pdf.bounds.left + postcard_width - in2pt(2.75)
    y = pdf.bounds.top  - in2pt(2.25)    - offset
    pdf.draw_text(str, :at =>[ x, y ], :size => 14)
}
#...
draw_it.call(contact.first_name + " " + contact.last_name,         0)
draw_it.call(contact.address.street1,                             20)
draw_it.call(contact.address.city + ", " + contact.address.state, 40)
draw_it.call(contact.address.zip,                                 60)

Затем еще один простой шаг, чтобы покончить с offset параметр:

offset  = 0
draw_it = lambda { |str|
    x       = pdf.bounds.left + postcard_width - in2pt(2.75)
    y       = pdf.bounds.top  - in2pt(2.25)    - offset
    offset += 20
    pdf.draw_text(str, :at =>[ x, y ], :size => 14)
}
#...
draw_it.call(contact.first_name + " " + contact.last_name)
draw_it.call(contact.address.street1)
draw_it.call(contact.address.city + ", " + contact.address.state)
draw_it.call(contact.address.zip)

Вы также можете сделать этот метод полноценным, но тогда вам придется правильно отслеживать и сбрасывать значение @offset, и в итоге вы будете перетаскивать практически бесполезный экземпляр.переменная (@offset) вокруг;простое замыкание, вероятно, имеет больше смысла для такого случая.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...