LINUX.ORG.RU

[rails] Имена полей


0

0

Доброго времени суток.

Прикручиваю вебморду на рельсах к БД, для управления другим приложением. Столкнулся с некоторыми проблемами. Исходя из задачи, следует, что имена полей менять нельзя, их следует использовать как есть.

Нельзя просто так использовать имя поля 'type', надо в models/user.rb добавить строку:

set_inheritance_column :ruby_type
. Но это пройдённый этап

В базе данных имеются поля с именами вида «session-timers» и т.п. Если попытаться вывести значение этого поля:

class UsersController < ApplicationController
def index
    @users=User.all
end

<table>
<% @users.each do |user| %>
  <tr>
    <td>
      <%=h user.session-timers%>
    </td>
  </tr>
<% end %>
</table>

то выдаётся ошибка вида:

ActionView::TemplateError (undefined method `session' for #<User:0xa3ff214>) on line #35 of app/views/users/index.html.erb

Как можно это обойти?

Подсказали: надо писать так

<%=h user.__send__("session-timers")%>

HolyBoy ()
Ответ на: комментарий от HolyBoy

>user.__send__(«session-timers»)

А не что-то подобное user[«session-timers»] там было? __send__ это как-то не очень красиво.

Deleted ()
Ответ на: комментарий от Deleted

Да, вы правы. Спасибо за подсказку. Вроде работает, также, из консоли запись значения в базу.

Несмотря на то, что рельса в логах постоянно ругается, когда идёт обращение к странице с таким объектом, вроде вывод работает корректно. Теперь, буду думать, как бы всякие хелперы, навроде

<% form_for (@user) do |t|%>
  <p>
    <%= t.label :name %>
    <%= t.text_field :name %>
  </p>
<%end%>
заставить работать и не отваливаться с ошибками на несуществующие методы.

HolyBoy ()
Ответ на: комментарий от HolyBoy

А с другими полями работает нормально? Помнится, с некоторыми именами были затыки из-за того, что они уже чем-то заняты. Может быть даже и name. У меня были подобные грабли как-то, во время чтения Agile web development with Rails и попыток делать по примеру, но не копипастом. // А потом в репах рельсы сломали…

Deleted ()
Ответ на: комментарий от Deleted

Затык был только с type. Обходится так, как выше написал. Сейчас рою буржуйские форумы на тему алиасов. Мне кажется, что это наилучший метод: создать в одном месте корректный алиас на нужное поле и дальше не волноваться.

HolyBoy ()
Ответ на: алиасы от HolyBoy

Похоже, что всё.

Таки остановился на указанном решении: http://snippets.dzone.com/posts/show/556

Вроде, теперь работает по-человечески: хелперы и прочее. Разобрался, не надо ничего патчить, надо в директории проекта своего добавить модуль и всё, ну и включить его там, где использовать хочешь.

Единственное, что осталось: это ругань сервера в логах

Exception occurred during reader method compilation.
Maybe session-refresher is not a valid Ruby identifier?
Exception occurred during reader method compilation.
Maybe session-timers is not a valid Ruby identifier?
/usr/lib64/ruby/gems/1.9.1/gems/activerecord-2.3.8/lib/active_record/attribute_methods.rb:1: syntax error, unexpected '-', expecting ';' or '\n'
def session-timers; missing_attribute('se...
            ^
/usr/lib64/ruby/gems/1.9.1/gems/activerecord-2.3.8/lib/active_record/attribute_methods.rb:1: syntax error, unexpected keyword_end, expecting $end
...tributes['session-timers']; end
...                               ^
Exception occurred during reader method compilation.
Maybe session-timers is not a valid Ruby identifier?
/usr/lib64/ruby/gems/1.9.1/gems/activerecord-2.3.8/lib/active_record/attribute_methods.rb:1: syntax error, unexpected '-', expecting ';' or '\n'
def session-timers=(new_value);write_attr...
            ^
/usr/lib64/ruby/gems/1.9.1/gems/activerecord-2.3.8/lib/active_record/attribute_methods.rb:1: syntax error, unexpected keyword_end, expecting $end
...session-timers', new_value);end
...                               ^
Exception occurred during reader method compilation.
Maybe session-timers is not a valid Ruby identifier?
/usr/lib64/ruby/gems/1.9.1/gems/activerecord-2.3.8/lib/active_record/attribute_methods.rb:1: syntax error, unexpected '-', expecting ';' or '\n'
def session-timers?; query_attribute('session-timers'); end
            ^
/usr/lib64/ruby/gems/1.9.1/gems/activerecord-2.3.8/lib/active_record/attribute_methods.rb:1: syntax error, unexpected keyword_end, expecting $end
def session-timers?; query_attribute('session-timers'); end
                                                           ^
но вроде она на работе не отражается. Правда, может где-то всплыть.

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