Ruby on rails rails form_介绍了如何在另一个模型中保存

Ruby 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

嗨,我想创建一个电子商务网站,并试图使数量系统

我想做的是:添加一个数量为CreateBasketItems的项目(2021_create_basket_items.rb)

问题:如何在item/show.html.erb中编写一些代码,它是表单_的一部分,尤其是with()

2021_创建_篮子_项目.rb

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,因此它将作为隐藏字段中的值填充,并在提交表单时随参数一起传递。

它可以解决此问题。非常感谢!!不客气!:)