Rails альтернатива включению активной записи вызова - PullRequest
3 голосов
/ 22 марта 2011

У меня есть частичная форма, которая выглядит следующим образом:

<%= form_for(@pool) do |f| %>
  <div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </div>
  <div class="field">
    <%= f.label :tournament %><br />
    <%= f.collection_select :tournament_id, Tournament.active, :id, :name, :prompt => true %>
  </div>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

Это похоже на запах кода, потому что представление не должно отвечать за знание того, как получить данные для тега <select>. Альтернатива для контроллера назначить переменную экземпляра проблематична, потому что мне приходится копировать этот код в нескольких действиях в зависимости от того, визуализируется ли эта форма.

В ASP.NET MVC я просто вытащил это поле в частичное представление и отобразил его с вызовом RenderAction, который оценил бы общее действие контроллера. Тем не менее, в Rails render :action => '/view', по-видимому, позволяет отображать только полноценные представления. Я довольно новичок в Rails, поэтому я не уверен насчет лучших практик.

Ответы [ 2 ]

2 голосов
/ 22 марта 2011

Вы можете сделать вспомогательный метод, как подсказывает coder_tim, но, по моему мнению, он по-прежнему оставляет доступ к данным в представлении.

Контроллер является подходящим местом для этого, и если вы беспокоитесь о дублировании, установитедо before_filter, который действует только на действия, для которых нужна эта коллекция:

before_filter :get_active_tournaments, :only => [:new, :edit]

, например.

Надеюсь, это поможет.

0 голосов
/ 22 марта 2011

Мне нравится запах этого кода :) Простота над экстремизмом. Меньше файлов = меньше методов для беспокойства = чистый код.

Однако бывают случаи, когда в вашем приложении слишком много раз используется раскрывающийся список, и это немного сложнее, чем просто вызов области. В этом случае я пишу помощник.

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