如何为所属关系设置Rails路线?

时间:2019-09-16 14:49:48

标签: ruby-on-rails many-to-many rails-routing

因此,我为在线零售商店提供了一个简单的数据库,该数据库与通过Cartproducts获得许多产品的用户之间的关系

用户有很多购物车产品,并且通过购物车产品有很多产品。 购物车产品属于用户和产品。 产品具有许多购物车产品,并且通过购物车产品具有许多用户。

如果阅读起来有点古怪,这是我的模型:

class User < ApplicationRecord
  has_many :cartproducts
  has_many :products, through: :cartproducts
end


class Cartproduct < ApplicationRecord
  belongs_to :user
  belongs_to :product
end


class Product < ApplicationRecord
    has_many :cartproducts
    has_many :users, through: :cartproducts
end

我想要做的是能够从后端向用户发布cartproducts(即向该用户购物车中添加商品),其路线类似于:users / 1 / cartproducts

我如何设置路线以允许从用户cartproduct中发布/更新/删除?如前所述,终结点类似于user /:userID / cartproducts。当前的问题是'users / 1 / cartproducts'返回与'users / 2 / cartproducts'相同的cartproducts数组。当我发布到users / 1 / cartproducts或users / 2 / cartproducts时,两者都进入了user / 1 / carproducts。

编辑:

这是我的路线,我确定这里有问题,

Rails.application.routes.draw do
  namespace :api do
    namespace :v1 do
      resources :products
      resources :users, only: [:index, :create, :show] do
        resources :cartproducts
          get '/user_cartproducts', to: "user#cartproducts"
      end
    end
  end
end

2 个答案:

答案 0 :(得分:0)

协会是正确的 第一步,您应该创建这样的路线(我能看到您的路线)

   resources :users do
    get :cartproducts, on: :member
   end

然后将操作添加到user_controller.rb

class UsersController < ApplicationController
  before_action :find_user_by_id, only: %I[show cartproducts]

  def show; end

  def cartproducts
    @cartproducts = @user.cartproducts
  end

  private 

  def find_user_by_id
    @user = User.find_by_id(params[:id])
  end
end

答案 1 :(得分:0)

您应该从路线中删除“ get”,例如:

Rails.application.routes.draw do
  namespace :api do
    namespace :v1 do
      resources :products
      resources :users, only: [:index, :create, :show] do
        resources :cartproducts
      end
    end
  end
end

现在,您应该有一个Cartproducts控制器来处理cart_products。 您应该发布到的网址应为:/ users / 1 / cartproducts 现在,来自Cartproducts控制器的create动作应为:

def create
  @user = User.find(params[:user_id])
  @cartproduct = @user.cartproducts.new(cartproduct_params)
  if @cartproduct.save
    # Do something on success
  else
    # Do something on failure
  end
end