2017-10-20 4 views
0

Quelqu'un peut-il me dire pourquoi l'entité crée toujours avec name == nil:Rails cant assigner des attributs pour une nouvelle entité

dans ProduitsController:

def create 
    @product = Product.new(name: params[:product][:name]) 
    byebug 
    if @product.save 
    redirect_to users_path 
    end 
end 

en vue:

<%= form_for Product.new do |f| %> 
    <%= f.label :name %> 
    <%= f.text_field :name %> 

    <%= f.submit %> 
<% end %> 
modèle

:

class Product < ApplicationRecord 
    has_many :categories 
    attr_accessor :name 
end 

Répondre

4

Quelqu'un peut-il me dire pourquoi l'entité crée toujours avec name == nil

En raison de votre attr_accessor. Il écrase les méthodes créées automatiquement à partir de l'enregistrement actif (celles qui connaissent la persistance). Retirez-le.

(en supposant que votre table a products colonne name. Si elle ne le fait pas, créez une migration pour l'ajouter.)

+0

juste, merci, si les rails créent automatiquement des getters et des setters, quelle utilisation de 'attr_accessor' alors? – nikolay

+1

@nikolay: pour créer des getters/setters qui ne sont pas supportés par des colonnes dans la base de données. –

+1

'attr_accessor' est ce que vous utilisez dans les classes ruby ​​simples pour créer des setters et des getters pour les attributs d'instance. Les modèles ActiveRecord sont en fait quelque peu exceptionnels car ils sont créés à partir d'une entrée externe et non du code. – max

1

Vous devez vous assurer que vous utilisez params forts pour cela, sinon les params ne passera pas comme prévu à savoir

def create 
    @product = Product.new(product_params) 
    byebug 
    if @product.save 
    redirect_to users_path 
    end 
end 

private 

def product_params 
    params.require(:product).permit(:name) 
end 

Plus d'informations peuvent être trouvées ici: http://guides.rubyonrails.org/action_controller_overview.html#strong-parameters

+0

params fort n'a rien à voir avec le problème qu'il a. Bonne idée, oui, mais complètement hors de propos ici. –

+0

Ah OK, merci - ne seraient-ils pas toujours confrontés au problème si le 'attr_accessor' était supprimé, sans les params forts? – SRack

+0

Non, pourquoi le ferait-il? –

0

Name est pas enregistré dans la base de données parce que vous avez utilisé name comme attr_accessor.

Créer une colonne name dans le tableau product. Si vous avez déjà la colonne name, puis supprimez attr_accessor :name du modèle product.rb.