Serialized form

Bonjour à tous,

Voilà j’ai un petit problème avec des paramètres serialisés, j’ai un
champ cty_settings de type text dans ma BDD,

dans mon model j’ai :

serialize :cty_settings

et dans mon formulaire :

<%= f.check_box ‘cty_settings[:new_question]’ %>

<%= f.check_box ‘cty_settings[:answer_question]’ %>

<%= f.check_box ‘cty_settings[:classified]’ %>

<%= f.check_box ‘cty_settings[:news]’ %>

<%= f.check_box ‘cty_settings[:bi]’ %>

et voilà les erreurs que je me prend :

undefined method `cty_settings[:new_question]’ for #<User:
0x106c5a470>
On line #240 of app/views/users/_user_form.rhtml

240: <%= f.check_box
‘cty_settings[:new_question]’ %>

alors qu’en console j’ai ça :

user = User.find(19070)

la fin de la réponse :

cty_settings:
{:bi=>1, :new_question=>1, :answer_question=>1, :news=>1,
:classified=>1}

et

user.cty_settings[:new_question]
=> 1

Pour info dans le champ cty_settings, j’ai :


new_question: 1
answer_question: 1
news: 1
classified: 1
bi: 1

On 7 sep, 13:27, chollier [email protected] wrote:

undefined method `cty_settings[:new_question]’ for #<User:
0x106c5a470>

Bonjour Loïc,

Il te faut utiliser le helper “check_box_tag” :
<%= check_box_tag ‘cty_settings[new_question]’, … %>

Note : ça oblige à gérer soi-même la valeur et l’état
coché/décoché,d’où les pointillés.


Julien Vignolles

Hello :slight_smile:

Merci j’arrive maintenant à afficher ma vue mais au moment des
modifications ça bloque, j’ai pourtant :

Processing UsersController#update (for 127.0.0.1 at 2009-09-07
16:28:28) [PUT]
Parameters: {… , “cty_settings”=>{“answer_question”=>“1”,
“bi”=>“0”, “new_question”=>“0”, “news”=>“0”,
“classified”=>“1”}, …}

mais ça ne me change rien dans la BDD

Ok en écrivant une réponse je viens de me rendre compte de mon erreur,
il me manquait user[ dans l’attribut name du tag :wink:

Salut,j’ai souvent cette problématique de sauvegarder des préférences en
sérialisé dans la base pour éviter d’avoir 50 colonnes. J’ai essayé de
voir
si on pouvait pas faire une serialisation plus “propre” avec un
fields_for
dans la vue.
Finalement avec un Hash cela ne fonctionne pas correctement (si
quelqu’un a
une solution avec un Hash, qu’il le dise :))

J’ai testé avec une OpenStruct et ça marche impec et ça me semble très
propre. Au final j’ai :

post.rb

class Post < ActiveRecord::Base
serialize :preferences, OpenStruct

def after_initialize
self.preferences ||= OpenStruct.new
end

def preferences=(preferences)
write_attribute(:preferences, OpenStruct.new(preferences))
end
end

environment.rb

require “ostruct”

_form.html.haml

  • form.fields_for :preferences do |pref_attributes|
    %label Draft
    = pref_attributes.check_box :draft

Nicolas.

Le 7 septembre 2009 16:57, chollier [email protected] a écrit :