2012-11-22 6 views
10

używamy „serializowania” cechę ActiveRecord w Rails takich jak to:Jak wyświetlić seryjny atrybut Array dla modelu Rails ActiveRecord w formularzu?

class User < ActiveRecord::Base 
    serialize :favorite_colors, Array 
    .... 
end 

więc możemy mieć

u = User.last 
u.favorite_colors = [ 'blue', 'red', 'grey' ] 
u.save! 

Więc zasadniczo ActiveRecord jest szeregowania tablicy powyżej i przechowuje je w jednej bazie danych pole o nazwie ulubione_ kolory.

Moje pytanie brzmi: w jaki sposób pozwalasz użytkownikowi wprowadzić swoje ulubione kolory w formularzu? Czy używasz serii pól tekstowych? A kiedy już zostaną wprowadzone, w jaki sposób pokazujesz je w formularzu do edycji?

To jest pytanie związane z Pomocnikiem formularzy Railsów dla serializowanego atrybutu tablicy.

Dzięki

Odpowiedz

2

Aby umożliwić dostęp do atrybutów AR, trzeba przyznać im tak:

class User < ActiveRecord::Base 
    serialize :favorite_colors, Array 
    attr_accessible :favorite_colors 
    .... 
end 
+0

Dziękuję, ale moje pytanie dotyczy sposobu pokazania tego atrybutu tablicy w formularzu, aby umożliwić edycję tego pola. –

+0

oh przepraszam - źle to zrozumiałem ... mimo że zredagowałem pytanie - moja wina – awenkhh

3

Jeśli chcesz multi-select HTML pola, spróbuj:

= form_for @user do |f| 
    = f.select :favorite_colors, %w[full colors list], {}, :multiple => true 

Jeśli korzystasz z klejnotu simple_form, możesz łatwo wybrać pola wyboru: ::

= simple_form_for @user do |f| 
    = f.input :favorite_colors, as: :check_boxes, collection: %w[full colors list] 
+1

Dzięki za komentarz. Nie chcę jednak, aby użytkownik wybierał z listy wstępnie zdefiniowanych kolorów.Chcę, aby użytkownik sam wprowadzał kolory w serii pól tekstowych. Jedno pole tekstowe na kolor. Czy mogę użyć do tego niektórych pomocników formularzy? Czy muszę sam to zakodować, na przykład utworzyć "wirtualny" atrybut w formie, a następnie połączyć je w tablicę przed wywołaniem update_attribites w kontrolerze? –

2

mogę rozwiązać ten problem „spłaszczenie” tablicę w widoku i roztwarzania macierzy w kontrolerze.

Potrzebne są również pewne zmiany w modelu, patrz poniżej.

class User < ActiveRecord::Base 

    serialize :favorite_colors, Array 

    def self.create_virtual_attributes (*args) 
     args.each do |method_name| 
      10.times do |key| 
       define_method "#{method_name}_#{key}" do 
       end 
       define_method "#{method_name}_#{key}=" do 
       end 
      end 
     end 
    end 

    create_virtual_attributes :favorite_colors 
end 

Jeśli nie definiują metody, takie jak powyższe, Rails byłoby narzekać elementu formularza za nazwisk w widoku, takie jak „favorite_colors_0” (patrz niżej).

W widoku, dynamicznie utworzyć 10 pól tekstowych, favorite_colors_0, favorite_colors_1 itp

<% 10.times do |key| %> 
    <%= form.label :favorite_color %> 
    <%= form.text_field "favorite_colors_#{key}", :value => @user.favorite_colors[key] %> 
<% end %> 

w kontrolerze, muszę połączyć favorite_colors_ * pola tekstowego do tablicy przed wywołaniem Zapisz lub update_attributes :

unless params[:user].select{|k,v| k =~ /^favorite_colors_/}.empty? 
    params[:user][:favorite_colors] = params[:user].select{|k,v| k =~ /^favorite_colors_/}.values.reject{|v| v.empty?} 
    params[:user].reject! {|k,v| k=~ /^favorite_colors_/} 
end 

Jedną z rzeczy, które robię, jest zakodowanie 10, co ogranicza liczbę elementów, które możesz mieć w tablicy ulubionych_colors. W formularzu generuje również 10 pól tekstowych. Możemy łatwo zmienić 10 do 100. Ale nadal będziemy mieli limit. Twoja sugestia, jak usunąć ten limit, jest mile widziana.

Mam nadzieję, że ten post użyteczne.

Powiązane problemy