умные части универсальной формы в рельсах

У меня есть виджет для валют, который я использую в своем приложении. Т.е. пользователь меняет валюту с EUR -> USD или около 13 других валют. У меня есть несколько других вариантов использования, таких как даты, но этот проще всего объяснить. Валюта в основном просто обновляет переменную сеанса, вызывая контроллер валюты, а затем использует некоторый JS для перезагрузки страницы, но я хотел бы получить только определенные элементы страницы (т.е. которые отражают изменение валюты и ничего больше)...

$("#places_list").html("<%= escape_javascript(render :partial => 'places/list') %>");

или если другой контроллер

$("#locations").html("<%= escape_javascript(render :partial => 'locations/places') %>");

но эти элементы относятся к текущему контроллеру, т. е. рендеринг части контроллера, такой как список... (сама математика валюты находится в помощнике приложения, поэтому никакой новой логики не происходит), а контроллер валюты прост частичная загрузка разными контроллерами. (места, места и т. д.)

Помимо создания действия в каждом контроллере, специально предназначенном для этой цели, как я могу заставить его вести себя так, чтобы я мог отображать элементы, специфичные для текущего контроллера, чтобы я мог разумно заменить их через js вместо перезагрузки? Т.е. Я могу передать в валюту текущий контроллер

<%= hidden_field_tag :info, controller.controller_name %>

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


person holden    schedule 05.10.2010    source источник
comment
одна возможная работа, которую я нашел, - это использование плагина render_component, который позволил бы мне отображать действие из-за пределов моего текущего контроллера... мне просто интересно, есть ли лучший способ, и если и почему это может быть плохо идея? github.com/vhochstein/render_component, поскольку исходный компонент рендеринга был извлечен до rails2, и мы живем в возраст рельсов 3.   -  person holden    schedule 05.10.2010


Ответы (1)


Я попробовал небольшое приложение, и ниже будет одно решение для вас,

прежде всего, в моем случае я пытаюсь иметь атрибут с именем :info в каждой модели, чтобы я мог вызывать его (‹%= f.text_field :info %>) в своих представлениях (обратите внимание f может быть любым экземпляром модели)

для этого мне нужно добавить атрибут :info к каждой модели. У вас есть несколько способов сделать это

1 - создать класс (который наследуется от AR::Base и наследует все остальные модели от данного класса) (но требует некоторых изменений в коде)

2 - Быстрый и уродливый способ - внедрить мой атрибут :info в класс AR::Base (что я и сделал;))

создайте файл в config/initializers, скажем, curreny.rb и добавьте этот код

module ActiveRecord
 class Base
   attr_accessor :info
 end
end 

после этого из любого представления, которое вы используете AR, будет иметь атрибут :info

Пример: пользователи/новые

Новый пользователь

<% form_for(@user) do |f| %>
  <%= f.error_messages %>

  <p>
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </p>
  <p>
    <%= f.label :info %><br />
    <%= f.text_field :info %>
  </p>
  <p>
    <%= f.submit 'Create' %>
  </p>
<% end %>

<%= link_to 'Back', users_path %>

Обратите внимание: это не очень хорошее решение, но думаю с этого можно начать думать

ваше здоровье

Самера

person sameera207    schedule 05.10.2010