此创建方法中的所有参数都被插入到数据库中;除了一个。嵌套形式或数据类型有问题吗?

All parameters in this create method are being inserted in the db; except for one. Is it an issue with nested form or the datatype?

我是 ruby rails 的新手,一般来说是编码。 我写了一个嵌套 form_for,其中价格 class 属于一个项目 class。 值 :amount、:timeframe 和 :item_id 将通过控制器存储。操作结束后,仅存储 :timeframe 和 :item_id,但不存储 :amount 值。

这是否与以下内容有关:

任何澄清将不胜感激!

表格如下:

<%= form_for @item, html: {multipart: true}  do |f| %>

    <div class="main-form">
        <div class="new-item-form">
            <%= f.label :title %>
            <%= f.text_field :title %>
        </div>

        <div class="new-item-form">
            <%= f.label :description %>
            <%= f.text_field :description %>
        </div>

        <div class="new-item-form">
            <%= f.label :deposit %>
            <%= f.text_field :deposit %>
        </div>

        <div class="new-item-form">
            <%= f.label :tags %>
            <%= f.text_field :tags %>
        </div>

        <div class="new-item-form">
            <%= f.label :image  %>
            <%= f.file_field :image  %>
        </div>

        <%= fields_for :price do |f| %>
        <div class="new-item-form">
            <%=f.label :timeframe %>
            <%= select_tag(:timeframe, options_for_select([["Hour"],["Day"],["Week"]])) %>
        </div>

        <div class="new-item-form">
            <%=f.label :amount %>
            <%=f.number_field :amount %>
        </div>
        <% end %>

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

这是控制器:

class ItemsController < ApplicationController
def show
    @item = Item.find(params[:id])
    @price = Price.where(item_id: @item.id).first
  end

  def new
    @item = Item.new
  end

  def create
    @item = Item.new(item_params)
    if @item.save
    @price = Price.create(:timeframe => params[:timeframe], :amount => params[:amount], :item_id => @item.id)
    @price.save
      redirect_to @item, notice: "Item Successfully Added!"
    else
      flash[:message] = "Something did not validate"
      render 'new'
    end
  end

  private
  def item_params
    params.require(:item).permit(:title, :description, :image, :user_id, :deposit, :tags)
  end

end

其他文档包括项目模型和价格模型:

class Item < ActiveRecord::Base
    validates :title, :description, :deposit, :tags,  presence: true

    belongs_to :user

    has_many :prices, :dependent => :destroy
    has_many :reviews, :dependent => :destroy
    has_many :ratings, :dependent => :destroy
    has_many :users_that_reviewed_this, through: :reviews, source: :user
    has_many :users_that_rated_this, through: :ratings, source: :user
end

class Price < ActiveRecord::Base
belongs_to :item end

以及这些 classes 的数据库架构:

create_table "items", force: :cascade do |t|
    t.string   "title"
    t.string   "description"
    t.string   "image"
    t.integer  "user_id"
    t.integer  "deposit"
    t.string   "type"
    t.string   "tags"
    t.datetime "created_at",  null: false
    t.datetime "updated_at",  null: false
  end

  create_table "prices", force: :cascade do |t|
    t.string   "timeframe"
    t.decimal  "amount"
    t.integer  "item_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

您的代码中的问题在 params[:amount]。没有参数,应该是 params[:price][:amount]。它将以这种方式工作!

虽然方法不是最"conventional" 这是使用 accepts_nested_attributes、将 prices_attributes 添加到 strong_parameters 并使用

的正确方法

在你的模型中

class Item < ActiveRecord::Base
    validates :title, :description, :deposit, :tags,  presence: true

    belongs_to :user

    has_many :prices, dependent: :destroy
    has_many :reviews, dependent: :destroy
    has_many :ratings, dependent: :destroy
    has_many :users_that_reviewed_this, through: :reviews, source: :user
    has_many :users_that_rated_this, through: :ratings, source: :user

    accepts_nested_attributes_for :prices, reject_if: :all_blank, allow_destroy: true

end

在你的控制器中

def create
    @item = Item.new(item_params)
    @item.prices.build
    if @item.save
      redirect_to @item, notice: "Item Successfully Added!"
    else
      flash[:message] = "Something did not validate"
      render 'new'
    end
  end

 private
 def item_params
    params.require(:item).permit(:title, :description, :image, :user_id, :deposit, :tags, prices_attributes: [:timeframe, :amount])
  end

在您看来

<%= form_for @item, html: {multipart: true}  do |f| %>

    <div class="main-form">
        <div class="new-item-form">
            <%= f.label :title %>
            <%= f.text_field :title %>
        </div>

        <div class="new-item-form">
            <%= f.label :description %>
            <%= f.text_field :description %>
        </div>

        <div class="new-item-form">
            <%= f.label :deposit %>
            <%= f.text_field :deposit %>
        </div>

        <div class="new-item-form">
            <%= f.label :tags %>
            <%= f.text_field :tags %>
        </div>

        <div class="new-item-form">
            <%= f.label :image  %>
            <%= f.file_field :image  %>
        </div>

        <%= f.fields_for :prices, Price.new do |p| %>
        <div class="new-item-form">
            <%=p.label :timeframe %>
            <%= p.select(:timeframe, [["Hour"],["Day"],["Week"]], :prompt => 'Select') %>
        </div>

        <div class="new-item-form">
            <%=p.label :amount %>
            <%=p.number_field :amount %>
        </div>
        <% end %>

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