2010-04-29 18 views
14

Ich habe ein Formular, das ich versuche einzurichten ... Benutzer können viele Beiträge haben, und jeder Beitrag kann viele Leute haben, die es beobachten.Wie Checkboxen in formtastic

Das Watch-Modell ist polymorph als "beobachtbar" eingerichtet, so dass es auf verschiedene Modelltypen angewendet werden kann. Es hat eine user_id, watchable_id, watchable_type und Zeitstempel als Attribute/Felder.

Dies ist soley, so dass Nutzer, die den Beitrag ansehen, per E-Mail darüber informiert werden können, wenn Nutzer einen Beitrag kommentieren.

Was ich versuche, ist, dem Benutzer eine Liste von Benutzern zu zeigen, die sie auf jedem Beitrag markieren können, was kein Problem ist. Das ist, was ich jetzt

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 %> 

Das Problem dabei verwendet wird, ist, dass, wenn Sie ein Update/Post gehen zu bearbeiten ... alle Kontrollkästchen sind prechecked ... Ich möchte um nur die Benutzer zu überprüfen, die gerade den Beitrag sehen.

Zur weiteren Klärung ... dies der hacky Weg ist jetzt

<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> 

wo @watches ist nur ein Array von Benutzer-IDs

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

pastie.org funktioniert nicht. Kannst du den Code woanders hinlegen? – kikito

+0

erledigt. Danke, dass du es dir angesehen hast. – concept47

Antwort

18

Für alle anderen das gleiche Problem mit:

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

Das funktioniert auch mit ': as =>: check_boxes' wenn Sie möchten, dass alle Kontrollkästchen überprüft werden – oskarae

+3

Kann auch nur sagen: input_html => {: checked => true} – TLK

2
ich es immer zu tun, was ich will

Setzen Sie den booleschen Attributwert im Controller auf "true", bevor Sie das Formular rendern. Dadurch sollte Formtastic die Checkbox auf 'checked' setzen.

2

Wenn Sie den Status der Checkbox müssen den Wert widerspiegeln: some_input

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

In Ihrem Modell ..

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

Das hat nicht für mich funktioniert. Es behandelte ': some_input?' Als truthy (weil es nicht 'nil' oder' false' ist). –

+0

Dies funktionierte für mich mit semantic_form_for –

3

Für mehrere Kontrollkästchen:

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