2010-12-14 37 views
3

Voici le code correspondant de views/products/edit.html.erb:Ruby on Rails: Pourquoi une boîte de sélection n'affiche pas la valeur actuelle de l'objet?

<%= form_for(:product, :url => {:action => 'update', :id => @product.id}) do |f| %> 
    <%= render(:partial => "form", :locals => {:f => f}) %> 
    <%= submit_tag("Update Product") %> 
<% end %> 

de views/products/_form.html.erb:

<%= select_with_new_option(f, :shop, :name, :id) %> 

et de helpers/products_helper.rb:

def select_options_with_create_new(objects, text_field, value_field, options={}) 
    object = objects.to_s.singularize 
    all_objects = object.capitalize.constantize.all 
    all_objects = all_objects.sort_by(&options[:order_by]) if options.has_key?(:order_by) 
    select_options = all_objects.map{ |obj| [obj.send(text_field), obj.send(value_field)] } 
    select_options << [wrap_create_new_option("create new #{object}".titleize), "new_#{object}"] 
    options_for_select(select_options) 
end 

def wrap_create_new_option(str) 
    ">> #{str} <<" 
end 

# By default, sorts by 'text_field'. 
def select_with_new_option(f, object, text_field, value_field) 
    f.select(:"#{object}_id", select_options_with_create_new(object.pluralize, text_field, value_field, :order_by => text_field)) 
end 

Je me attends à la boîte de sélection pour être @product.shop_id par défaut, mais ce n'est pas vrai (la première option est toujours la valeur par défaut).

Qu'est-ce qui me manque?

Répondre

7

Très bien, je l'ai eu. Supprimez simplement options_for_select(select_options) dans la méthode select_options_with_create_new.

Le options_for_select assemble la matrice 2-D select_options en une chaîne d'options html, qui est acceptée par l'outil d'aide sous forme select, cependant, sans attribuer l'attribut selected. Il suffit de passer le tableau 2-d à la méthode select comme deuxième argument, il affecterait automatiquement le selected.

+0

Vous êtes génial! Il a résolu le problème. Merci beaucoup!!! –

0

Je pense que, dans ce cas, tout ce que vous devez faire est de vous assurer que vous définissez @product dans votre action edit:

def edit 
    @product = Product.find(params[:id]) 
end 

Ensuite, changez votre première ligne:

<%= form_for(:product, :url => {:action => 'update', :id => @product.id}) do |f| %> 

à

<%= form_for(@product, :url => {:action => 'update', :id => @product.id}) do |f| %> 

Le premier bloc de code va certainement mettre à jour le bon produit, mais y Vous ne verrez que les valeurs actuelles reflétées si vous générez un form_for @product, avec cet ensemble de variables @product.

+0

J'ai défini '@ product' dans la méthode' edit' exactement comme vous l'avez écrit. J'ai également essayé de changer ': product' en' @ product', mais cela n'a pas aidé. Avez-vous d'autres idées sur ce qui pourrait être faux? –

+0

Est-ce que @ product.id et obj.send (value_field) sont du même type? Si l'un est un entier et l'autre est une chaîne qui pourrait causer le problème que vous voyez. L'autre chose à surveiller est que certains navigateurs n'affichent pas la modification si vous actualisez la page et que l'option actuellement sélectionnée dans la boîte de sélection change, donc tester ces changements peut être trompeur. – Iain

+0

@lain: '@ product.id' est un nombre entier. 'obj.send (field_valeur)' est 'shop.send (: id)' dans mon cas, ce qui est équivalent à 'shop.id', qui est aussi entier. Je crois que ce navigateur n'est pas le problème ici. J'utilise le dernier Firefox. –