0

私は と へのモデルを持っていProductます。製品フォームには、名前 (テキスト)、カテゴリ (選択)、価格 (テキスト) のフィールドしかありません。belongs_toUserCategorynew

これは、カテゴリの選択フィールドを次のように作成した方法です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 オブジェクトをロードし、(ロケールに依存する) 価格の通貨表現を 10 進数に変換するコードを追加する必要がありました。だからこれは私が働いたものです:

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ます。

10 進数への変換は必要ありません。モデルに検証を追加することを検討してください。

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」という列 (整数) が必要だと思います。このようにして、コントローラーコードを追加しなくても select が機能するはずです。価格に関しては、params ハッシュから 10 進数を受け入れる方法があるはずですが、フォームを確認する必要があると思います。

于 2012-04-29T19:31:26.653 に答える