2017-10-20 46 views
0

谁能告诉我,为什么实体总是name == nil创建:的Rails不能分配属性为新的实体

在ProductsController的

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

鉴于:

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

    <%= f.submit %> 
<% end %> 

型号:

class Product < ApplicationRecord 
    has_many :categories 
    attr_accessor :name 
end 

回答

4

谁能告诉我,为什么实体总是name == nil

因为你attr_accessor的创建。它从活动记录(那些知道持久性的记录)中覆盖自动创建的方法。只要删除它。

假设你的表products有列name。如果没有,创建一个迁移添加它。

+0

对,谢谢,如果rails自动创建getter和setter,那么attr_accessor的用法是什么? – nikolay

+1

@nikolay:创建不受数据库中列支持的getter/setter。 –

+1

'attr_accessor'是你在普通的ruby类中用来为实例属性创建setter和getters的东西。 ActiveRecord模型实际上有点特殊,因为它们是从外部输入而不是代码创建的。 – max

1

你需要确保你使用这个强大的参数,可以以其他方式如预期即PARAMS不会通过在

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 

更多信息可以在这里找到:http://guides.rubyonrails.org/action_controller_overview.html#strong-parameters

+0

强烈的参数与他遇到的问题无关。好主意,是的,但在这里完全不相关。 –

+0

好的,谢谢 - 他们会不会仍然面临问题是'attr_accessor'被删除,没有强大的参数? – SRack

+0

不,他为什么? –

0

Name未保存在数据库因为您使用name作为attr_accessor

创建name列在product表中。如果您已有name列,请从product.rb模型中删除attr_accessor :name

相关问题