2012-06-18 4 views
0

Dans le modèle Topic:accepte_nested_attributes_for alias?

class Topic < ActiveRecord::Base 
    has_many :choices, :dependent => :destroy 
    accepts_nested_attributes_for :choices 
    attr_accessible :title, :choices 
end 

Au cours d'un POST créer, le params soumis est :choices, au lieu de :choices_attributes attendu par Rails et donnant une erreur:

ActiveRecord::AssociationTypeMismatch (Choice(#70365943501680) expected, 
got ActiveSupport::HashWithIndifferentAccess(#70365951899600)): 

est-il un moyen de config accepts_nested_attributes_for accepter les paramètres passant comme choices au lieu de choices_attributes dans un appel JSON?

Actuellement, je l'ai fait la création d'attributs dans le contrôleur (qui ne semble pas être une solution élégante):

def create 
    choices = params[:topic].delete(:choices) 
    @topic = Topic.new(params[:topic]) 
    if choices 
     choices.each do |choice| 
     @topic.choices.build(choice) 
     end 
    end 
    if @topic.save 
     render json: @topic, status: :created, location: @topic 
    else 
     render json: @topic.errors, status: :unprocessable_entity 
    end 
    end 

Répondre

0

Vous pouvez créer méthode choices= dans le modèle comme

def choices=(params) 
    self.choices_attributes = params 
end 

Mais vous Je vais casser ton setter pour l'association des choix.

La meilleure façon est de modifier votre formulaire pour retourner à la place choices_attributeschoices

0

Ceci est une question plus, mais je couru dans le même problème. Y a-t-il un autre moyen de contourner cela? Il semble que la chaîne "_attributes" soit codée en dur dans le code nested_attributes.rb (https://github.com/rails/rails/blob/master/activerecord/lib/active_record/nested_attributes.rb#L337).

L'affectation de "choices_attributes" à une propriété lors de la soumission d'un formulaire est correcte, mais que faire si elle est utilisée pour une API. Dans ce cas, cela n'a aucun sens.

Est-ce que quelqu'un a un moyen de contourner cela ou une alternative lors du passage JSON pour une API?

Merci.

MISE À JOUR:

Eh bien, puisque je ne l'ai pas entendu les mises à jour sur ce que je vais montrer comment je contourner ce moment. Étant nouveau à Rails, je suis ouvert aux suggestions, mais c'est la seule façon dont je peux comprendre pour le moment.

J'ai créé une méthode adjust_for_nested_attributes dans mon API base_controller.rb

def adjust_for_nested_attributes(attrs)  
    Array(attrs).each do |param| 
    if params[param].present? 
     params["#{param}_attributes"] = params[param] 
     params.delete(param) 
    end 
    end 
end 

Cette méthode convertit essentiellement tous les attributs qui lui sont transmises # {attr} _attributes pour que cela fonctionne avec accepts_nested_attributes_for.

Ensuite, dans chaque contrôleur qui a besoin de cette fonctionnalité j'ai ajouté un before_action comme si

before_action only: [:create] do 
    adjust_for_nested_attributes(:choices) 
end 

En ce moment, je suis seulement inquiet pour la création, mais si vous avez besoin pour la mise à jour, vous pouvez ajouter que dans le « seulement 'clause de la before_action.

0
# Adds support for creating choices associations via `choices=value` 
    # This is in addition to `choices_attributes=value` method provided by 
    # `accepts_nested_attributes_for :choices` 
    def choices=(value) 
    value.is_a?(Array) && value.first.is_a?(Hash) ? (self.choices_attributes = value) : super 
    end 
Questions connexes