2017-10-20 14 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

相關問題