此创建方法中的所有参数都被插入到数据库中;除了一个。嵌套形式或数据类型有问题吗?
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 值。
这是否与以下内容有关:
嵌套形式?
: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%>
我是 ruby rails 的新手,一般来说是编码。 我写了一个嵌套 form_for,其中价格 class 属于一个项目 class。 值 :amount、:timeframe 和 :item_id 将通过控制器存储。操作结束后,仅存储 :timeframe 和 :item_id,但不存储 :amount 值。
这是否与以下内容有关:
嵌套形式?
: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%>