LINUX.ORG.RU

[RoR] Куда делся объект?

 


0

0

Наткнулся на косяк:

в шаблоне пишем:

<%= debug(post) %>
Получаем:
... фуё-моё ...
  ip: !ruby/object:IPAddr 
    addr: 2130706433
    family: 2
    mask_addr: 4294967295
...

т. е. структура объекта в порядке, и post.ip, казалось бы, должен быть объектом типа IPAddr

Теперь в тот же debug пишем post.ip и получаем 2130706433. Куда делся объект?

★★★★★

Контроллер:

                @posts = Post.find(:all).map do |p|
                        p.ip     = IPAddr.new(p.ip, Socket::AF_INET)
                        p.tstamp = Time.at(p.tstamp)
                        p
                end

post.inspect в том же шаблоне говорит, что ip число, debug говорит, что объект. Где правда?

INFOMAN ★★★★★
() автор топика
Ответ на: комментарий от kelyar

Уже засунул преобразование в шаблон. Возможно, это ActiveRecord что-то там мутит. Хотя странно, что дебаговый дамп при этом показывает новое значение.

INFOMAN ★★★★★
() автор топика

в debug() твой объект проходит to_yaml или, если не получилось, обычный inspect, а потом html_escape aka h, то есть to_s и т.д. где-то там IPAddr и преобразуется. имхо лучше им не пользоваться вообще, если не знаешь что он делает с твоим объектом. меня лично это смущает. <%= post.ip.inspect %> и все. ну, post.ip.to_yaml, если нравится.

хинт.
>> require 'ipaddr'

==> true
>> require 'erb'

==> true
>> ip = IPAddr.new(2130706433,Socket::AF_INET)

==> #<IPAddr: IPv4:127.0.0.1/255.255.255.255>
>> ERB::Util.html_escape(ip)

==> "127.0.0.1"

volh ★★
()
Ответ на: комментарий от INFOMAN

P.S. 

раз уж проходил мимо, не удержусь.

>@posts = Post.find(:all).map do |p|
>                        p.ip     = IPAddr.new(p.ip, Socket::AF_INET)
>                        p.tstamp = Time.at(p.tstamp)
>                        p
>                end

этому имнсхо не место в контроллере. если у тебя есть поле ip, то почему бы его не хранить как ip адрес? постгрес поддерживает, мускуль вроде тоже. его и валидировать можно потом нормально, глянь дополнения к ActiveRecord::Validations здесь http://dsadmin.dotsrc.org/dsadmin/doc/api/classes/ActiveRecord/Base.html . если же по какой-то причине хочется хранить ip именно как число, то лучше сделать метод модели, вроде ip_addr, где ip будет преобразовываться. 

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

volh ★★
()

Еще один умник со "своим подходом". Специально для вас сделали created_at / _on (для даты).

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.