умные универсальные частичные формы в рельсах - PullRequest
0 голосов
/ 05 октября 2010

У меня есть виджет для валют, которые я использую во всем приложении. То есть. пользователь меняет валюту с 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 %>

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

1 Ответ

0 голосов
/ 06 октября 2010

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

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

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

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

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

создайте файл в config / initializers, скажем currenty.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 %>

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

ура

Sameera

...