2010-04-29 1 views
14

У меня есть форма, которую я пытаюсь настроить ... У пользователей может быть много сообщений, и у каждого сообщения может быть много людей, которые смотрят его.Как предварительно проверить флажки в formtastic

Модель часов установлена ​​полиморфно как «наблюдаемая», поэтому она может применяться к различным типам моделей. Он имеет user_id, watchable_id, watchable_type и timestamps как атрибуты/поля.

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

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

http://pastie.org/940421

<% semantic_form_for @update do |f| %> 
     <%= f.input :subject, :input_html => { :class => 'short' } %> 
     <%= f.input :site, :include_blank => false, :input_html => { :class => 'short' } %> 
     <label>Tag Users (they will get notified of this update)</label> 
     <%= f.input :user, :as => :check_boxes, :label => '&nbsp;', :wrapper_html => { :class => "radiolist clearfix" }, :for => :watch, :name => "Watch" %> 

     <%= f.input :note, :label => 'Update'%> 
     <% f.buttons do %> 
     <%= f.commit_button :button_html => { :class => 'submit' } %> 
     <% end %> 
    <% end %> 

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

Для дальнейшего уточнения ... это Hacky способ я получаю это делать то, что я хочу прямо сейчас

<ul class="radiolist clearfix"> 
<% @users.each do |user| %> 
    <li> 
    <%= check_box_tag 'user_ids[]', user.id, @watches.include?(user.id) ? true : false -%> 
    <%= h user.name -%> 
    </li> 
<% end %> 
</ul> 

где @watches только массив пользовательских идентификаторов

@watches = @update.watches.map{|watcher| watcher.user_id} 
+2

pastie.org не работает. Можете ли вы поместить код в другое место? – kikito

+0

сделано. Спасибо, что посмотрели на него. – concept47

ответ

18

Для тех, кто еще, имеющий тот же вопрос:

<%= f.input :some_input, :as => :boolean, :input_html => { :checked => 'checked' } %> 
+0

Это также отлично работает с ': as =>: check_boxes' , если вы хотите, чтобы все флажки были отмечены – oskarae

+3

Можете также просто сказать: input_html => {: checked => true} – TLK

2

Установите значение атрибута boolean в 'true' в контроллере, прежде чем вы будете визуализировать форму. Это должно сделать Formtastic по умолчанию для флажка «checked».

2

Если вам нужно состояние флажка, чтобы отразить значение: some_input

<%= form.input :some_input, :as => :boolean, :input_html => { :checked => :some_input? } %> 

В модели ..

def some_input? 
    self.some_input ? true : false 
end 
+0

Это не сработало для меня. Он обрабатывал ': some_input?' Как правдивый (потому что это не 'nil' или' false'). –

+0

Это работало для меня, используя semantic_form_for –

3

Для нескольких флажков, таким образом:

<%= f.input :tags, :as => :check_boxes, :collection => some_map.collect { |c| [c[:name], c[:id], {:checked=> tag_ids.include?(c[:id])}] } %>