Ruby on rails rails form_介绍了如何在另一个模型中保存
嗨,我想创建一个电子商务网站,并试图使数量系统 我想做的是:添加一个数量为CreateBasketItems的项目(2021_create_basket_items.rb) 问题:如何在item/show.html.erb中编写一些代码,它是表单_的一部分,尤其是with() 2021_创建_篮子_项目.rbRuby on rails rails form_介绍了如何在另一个模型中保存,ruby-on-rails,ruby,Ruby On Rails,Ruby,嗨,我想创建一个电子商务网站,并试图使数量系统 我想做的是:添加一个数量为CreateBasketItems的项目(2021_create_basket_items.rb) 问题:如何在item/show.html.erb中编写一些代码,它是表单_的一部分,尤其是with() 2021_创建_篮子_项目.rb class CreateBasketItems < ActiveRecord::Migration[5.2] def change create_tabl
class CreateBasketItems < ActiveRecord::Migration[5.2]
def change
create_table :basket_items do |t|
t.references :basket, index: true, null: false, foreign_key: true
t.references :item, index: true, null: false, foreign_key: true
t.integer :quantity, null: false, default: 1
t.timestamps
end
end
end
项目_controller.rb
class ItemsController < ApplicationController
# before_action :authenticate_user!
def show
basket = current_user.prepare_basket
@item = Item.find(params[:id])
@basket_item = basket.basket_items(params[:quantity])
end
def index
# if(params[:category])
# @items = Item.where(category: params[:category]).paginate(page: params[:page])
# else
# @items = Item.paginate(page: params[:page])
# end
@items = (params[:category]) ? Item.where(category: params[:category]).paginate(page: params[:page]) :
Item.paginate(page: params[:page])
end
end
class Items::AddToBasketsController < Items::ApplicationController
def create
basket = current_user.prepare_basket
@item = Item.find(params[:item_id])
@basket_item = basket.basket_items(params[:quantity])
basket.basket_items.create!(item_id: @item.id, quantity: @basket_item)
flash[:success] = "your item in basket"
redirect_to baskets_path
end
end
class ItemsController
将_添加到_basket_controller.rb
class ItemsController < ApplicationController
# before_action :authenticate_user!
def show
basket = current_user.prepare_basket
@item = Item.find(params[:id])
@basket_item = basket.basket_items(params[:quantity])
end
def index
# if(params[:category])
# @items = Item.where(category: params[:category]).paginate(page: params[:page])
# else
# @items = Item.paginate(page: params[:page])
# end
@items = (params[:category]) ? Item.where(category: params[:category]).paginate(page: params[:page]) :
Item.paginate(page: params[:page])
end
end
class Items::AddToBasketsController < Items::ApplicationController
def create
basket = current_user.prepare_basket
@item = Item.find(params[:item_id])
@basket_item = basket.basket_items(params[:quantity])
basket.basket_items.create!(item_id: @item.id, quantity: @basket_item)
flash[:success] = "your item in basket"
redirect_to baskets_path
end
end
class Items::AddToBasketController
因此,也可以查看您的路由,但我猜您的表单指向了与Items::addToBasketController#create
操作匹配的url。从您分享的内容来看,控制器中似乎有一些东西是问题的一部分。您将要创建一个有数量的backet_项目,它引用一个篮子和一个项目。您可以做的一件事是在会话中存储当前用户的活动篮id,然后使用类似current\u basket
的方法来检索当前用户的活动篮
def current_basket
if session[:active_basket_id]
@current_basket = current_user.baskets.find_by_id(session[:active_basket_id])
else
@current_basket = current_user.prepare_basket
session[:active_basket_id] = @current_basket.id
end
@current_basket
end
此时,您所需要的就是能够通过params提交item_id和数量。如果你想让事情保持平静,你可以选择这样的路线:
post '/basket_items', to: 'Items::AddToBasketsController#create'
def create
current_basket.basket_items.create!(basket_item_params)
flash[:success] = "your item in basket"
redirect_to baskets_path
end
<%= form_with model: @item.basket_items.build, method: :post do |f| %>
<%= f.hidden_field :item_id %>
<%= f.select :quantity,[1,2,3], id: "country1", class: "frm-field required sect" %>
<%= f.submit "add to basket", class: "item_add" %>
<% end %>
然后在控制器中,还需要有强参数:
def basket_item_params
params.require(:basket_item).permit(:item_id, :quantity)
end
您需要更新“创建”操作以执行以下操作:
post '/basket_items', to: 'Items::AddToBasketsController#create'
def create
current_basket.basket_items.create!(basket_item_params)
flash[:success] = "your item in basket"
redirect_to baskets_path
end
<%= form_with model: @item.basket_items.build, method: :post do |f| %>
<%= f.hidden_field :item_id %>
<%= f.select :quantity,[1,2,3], id: "country1", class: "frm-field required sect" %>
<%= f.submit "add to basket", class: "item_add" %>
<% end %>
current\u basket.basket\u items.create!(basket\u item\u params)
将自动分配basket\u id
,因为我们将basket\u项目建立在其与当前篮子的关联上。此方法来自basket
类中的有许多:basket\u项。你可以阅读更多关于
最后,除了数量之外,表单还有一个隐藏字段,用于项目id。篮子可以来自会话(这样,当您从一个页面切换到另一个页面时,您可以将多个项目添加到同一个篮子中。表单看起来更像这样:
post '/basket_items', to: 'Items::AddToBasketsController#create'
def create
current_basket.basket_items.create!(basket_item_params)
flash[:success] = "your item in basket"
redirect_to baskets_path
end
<%= form_with model: @item.basket_items.build, method: :post do |f| %>
<%= f.hidden_field :item_id %>
<%= f.select :quantity,[1,2,3], id: "country1", class: "frm-field required sect" %>
<%= f.submit "add to basket", class: "item_add" %>
<% end %>
使用@item.basket\u items.build构建basket\u items
将自动分配其项目id,因此它将作为隐藏字段中的值填充,并在提交表单时随参数一起传递。它可以解决此问题。非常感谢!!不客气!:)