2010-04-14 2 views
0

J'utilise Rails 2.3.5 et ont une structure imbriquée comme suit:emboîtées à l'aide accepts_nested_attributes_for avec pré-population d'une autre table

Lists has_many Items 

Items_Features has_many Features 
Items_Features has_many Items 

Items_Features has a text field to hold the value of the feature 

J'ai une forme imbriquée avec partials mettre à jour et afficher cette Ce qui je veux faire est de générer des champs d'entrée pour chacune des lignes dans les fonctionnalités de sorte que l'utilisateur peut remplir une valeur et il est inséré/mis à jour dans items_features. Je veux aussi une étiquette à côté de la boîte pour afficher le nom de la fonction.

Il pourrait ressembler à ceci:

List name: Cheeses 
    Item1 name: Edam 
     Feature, hardness: - fill in - <= this list of features from feature table 
     Feature, smell: - fill in - 

Comment puis-je interrompre le système accepts_nested_attributes_for agréable et facile d'afficher ce que je veux?

EDIT:

Voici le code pour la classe Item maintenant j'ai quelques sql là-bas:

class Item < ActiveRecord::Base 
    belongs_to :list 
    has_many :users 
    has_many :votes 
    has_many :items_features 
    validates_presence_of :name, :message => "can't be blank" 
    accepts_nested_attributes_for :items_features, :reject_if => lambda { |a| a.values.all?(&:blank?) }, :allow_destroy => true 

    def self.get_two_random(list_id) 
    Item.find_by_list_id(list_id, :limit => 2, :order => 'rand()') 
    end 

    def self.get_item_features(item_id) 
    sql = "select items_features.*, features.id as new_feature_id, features.name as feature_name " 
    sql += "from items_features " 
    sql += " right outer join features " 
    sql += " on features.id = items_features.feature_id " 
    sql += " left outer join items " 
    sql += " on items.id = items_features.item_id " 
    sql += "where items_features.item_id = ? or items_features.item_id is null" 

    find_by_sql([sql, item_id]) 
    end 

end 

Voici mon code d'affichage - je dois enregistrer le feature_id dans de nouveaux records en quelque sorte:

<% form_tag item_path, :method => :put do %> 
<% for items_feature in @item_features %> 
    <% fields_for "items_features[]", items_feature do |f| %> 
    <%=h items_feature.feature_name %> <%= f.text_field :featurevalue %><br><Br> 
    <% end %> 
<% end %> 
<p><%= submit_tag "Submit"%></p> 
<% end %> 

Hmm, qui ne fonctionne pas - il imprime bien, mais le serveur me donne:

/!\ FAILSAFE /!\ Thu Apr 15 16:44:59 +0100 2010 
Status: 500 Internal Server Error 
expected Array (got Hash) for param `items_features' 

Quand je posterai retour

Répondre

1
+0

Salut Will, merci pour jeter un oeil à ce sujet. J'ai vraiment utilisé cet exemple et c'est génial. Cela ne m'amène pas vraiment là. J'expérimente maintenant avec un find_by_sql pour obtenir l'enregistrement avec les valeurs vides pour 'caractéristiques du fromage' comme ci-dessus. Je vais modifier le post ci-dessus avec le sql afin que vous puissiez voir ce que je veux dire. Il affiche les fonctionnalités que je veux maintenant. Je dois juste sauvegarder item_feature avec peut-être un champ caché pour feature_id? – mikeydelamonde

Questions connexes