0

我有一个Product模型belongs_toaUser和 to a Category。在new产品表单中,我只有名称(文本)、类别(选择)和价格(文本)字段。

这就是我为类别创建选择字段的方式products/new.html.haml

= f.collection_select :category, Category.all, :id, :name

ProductsController,我想我只需要这样做:

def create
  @product = Product.new(params[:product])
  if @product.save
    # do something
  else
    render 'new'
  end
end

但我最终需要添加代码来加载 Category 对象并将价格的货币表示(取决于区域设置)转换为十进制。所以这就是我的工作:

def create
  params[:product][:category] = Category.find(params[:product][:category])
  # to_decimal is declared as a private method in ProductsController
  # and returns a decimal number or nil if the price is invalid
  params[:product][:price] = to_decimal(params[:product][:price])
  @product = Product.new(params[:product])
  if @product.save
    # do something
  else
    render 'new'
  end
end

所以我的问题是:

1)有没有办法让 Rails 自动加载类别?

2)我是否正确地“格式化”了价格?看起来它应该在模型中,但我无法让它通过控制器工作。

谢谢!

4

2 回答 2

1

Rails 约定中有一条规则称为skinny controller - fat model.

您不需要任何转换为​​十进制,请考虑向您的模型添加验证:

validates :price, :numericality => true, :presence => true

这意味着您的价格必须是一个数字并且不能为空。

品类呢?将字段添加category_id到您的Product表中,并在模型中放置:

# product.rb
belongs_to :category
# category.rb
has_many :products

请向我们展示您的表格,并将此页面作为您的朋友记住:http: //guides.rubyonrails.org/

于 2012-04-29T19:45:57.130 回答
0

我认为您的产品表需要一个名为“category_id”的列(整数)。这样,您的选择应该在没有额外的控制器代码的情况下工作。至于价格,应该有一种方法可以从 params 哈希中接受小数,但我认为我需要查看您的表格。

于 2012-04-29T19:31:26.653 回答