Ruby on rails Ruby Rails路径按用户显示所有项

Ruby on rails Ruby Rails路径按用户显示所有项,ruby-on-rails,path,controller,routes,Ruby On Rails,Path,Controller,Routes,这里有一个RoR初学者。我正在尝试实现一个页面“我的产品”,以显示当前用户添加的所有产品。目前,我已将我的“所有产品”页面设置为我的索引根“产品#索引”。我的产品有控制器,但我的用户没有控制器,因为我使用的是Desive。我有几个问题还没答对 因为现在 产品 belongs_to :user 使用者 路线 devise_for :users resources :products 我有几条路线 new_user_session GET /users/sign_in(.:for

这里有一个RoR初学者。我正在尝试实现一个页面“我的产品”,以显示当前用户添加的所有产品。目前,我已将我的“所有产品”页面设置为我的索引根“产品#索引”。我的产品有控制器,但我的用户没有控制器,因为我使用的是Desive。我有几个问题还没答对

因为现在

产品

belongs_to :user
使用者

路线

devise_for :users
resources :products
我有几条路线

new_user_session      GET    /users/sign_in(.:format)                  devise/sessions#new
         user_session POST   /users/sign_in(.:format)                  devise/sessions#create
 destroy_user_session DELETE /users/sign_out(.:format)                 devise/sessions#destroy
        user_password POST   /users/password(.:format)                 devise/passwords#create
    new_user_password GET    /users/password/new(.:format)             devise/passwords#new
   edit_user_password GET    /users/password/edit(.:format)            devise/passwords#edit
                      PATCH  /users/password(.:format)                 devise/passwords#update
                      PUT    /users/password(.:format)                 devise/passwords#update
cancel_user_registration GET    /users/cancel(.:format)                   devise/registrations#cancel
    user_registration POST   /users(.:format)                          devise/registrations#create
new_user_registration GET    /users/sign_up(.:format)                  devise/registrations#new   edit_user_registration GET    /users/edit(.:format)                     devise/registrations#edit
                      PATCH  /users(.:format)                          devise/registrations#update
                      PUT    /users(.:format)                          devise/registrations#update
                      DELETE /users(.:format)                          devise/registrations#destroy
products              GET    /products(.:format)                       products#index
                      POST   /products(.:format)                       products#create
          new_product GET    /products/new(.:format)                   products#new
         edit_product GET    /products/:id/edit(.:format)              products#edit
              product GET    /products/:id(.:format)                   products#show
                      PATCH  /products/:id(.:format)                   products#update
                      PUT    /products/:id(.:format)                   products#update
                      DELETE /products/:id(.:format)                   products#destroy
目前,我想实现这一目标:

创建一个UserController,使其具有@user=user.all,因为通过关联,我可以使用@user.product。(我看到一些人说我不应该因为Desive而创建新的控制器?)但是,在实现之前,我尝试使用rails控制台进行测试

 product = Product.first
 product.user #here I get all details about user

 user = User.first
 user.product #here I get error. Why it works for product to find user but not both ways?
接下来,这让我想知道如何创建和配置路由以获取path/users/:id/products。我应该使用嵌套资源吗

下一个问题,我试着

resources :users do
  resources :products
end

resources :products
我又打了一遍。我很困惑

 user_products GET    /users/:user_id/products(.:format)          products#index
 products GET    /products(.:format)                         products#index 
问题:

  • 2路径是否具有相同的控制器动作
  • 用户产品路径和产品路径是两个不同的路径,其中用户产品路径表示用户的产品。产品路径表示所有产品
  • 抱歉发了这么长的帖子。我真的想澄清这些事情。如果你能帮忙,非常感谢!!:)

    user.product#这里有个错误。为什么它能为产品找到用户,但不是双向的

    由于
    用户拥有多个:产品
    ,您需要使用正确的关联名称:

     user.products # it will give you all products of an user
    
    2路径是否具有相同的控制器动作

    简言之,是的。您可以在
    route.rb中明确指定控制器和操作名称,如:

    get 'users/:id/products' => 'products#index', :as => :user_products_path
    
    注意在您的情况下,默认情况下它也将进入
    产品#索引

    用户产品路径和产品路径是两个不同的路径,其中用户产品路径表示用户的产品。产品路径表示所有产品


    没错,绝对没问题。当您使用
    designe
    时,不需要使用来自URL的
    id
    参数,即
    users/:id/products
    。您可以直接从
    当前用户
    获取用户,这在安全性方面也更好。请记住,如果您具有管理员角色,可以查看每个用户的详细信息,那么在这种情况下,您将需要管理
    id

    因为您才刚刚开始,我将使用易于阅读的逻辑来简化此示例。但是,有更好的方法来配置和优化它,这样您就不会依赖控制器中的
    if
    语句

    class ProductsController < ApplicationController
      def index
        if params[:user_id]
          @user = User.find(params[:user_id])
          @products = @user.products.all
        else
          @products = Product.all
        end
      end
    end
    
    class ProductsController
    这种做法不好的一个原因是您依赖于
    user\u id
    param才有效。如果
    user\u id
    参数无效,则第二行
    @products=@user.products.all
    将为Nil类返回
    未定义的方法

    另外,在视图中,如果引用
    @user
    ,那么如果只是列出所有产品,就会出现错误

    此外,如果任何人知道或试图猜测用户的
    id
    ,他们都可以看到任何人的产品,但没有任何安全措施

    但是,这应该在您的实例中起作用。您还可以考虑,如果“代码”> USER ID 存在,则调用<代码> CurrutsUp.Sudio.Ung/Ung>,以便只返回当前用户的产品而不是特定的<代码> USER ID 。然而,这实际上取决于您如何设计应用程序来确定最佳路线


    我通常会做的是,如果
    /products
    路由应该用于管理级别,我会
    名称空间
    它,并在名称空间周围放置适当的安全性,以便它不允许普通用户访问它,但只限于网站管理员。

    试试user.Products Summing我决定创建一个新页面来显示“我的产品”,我刚才做的是:1。在产品控制器下,def showall@Products=current_user.Products end 2。在产品视图3下创建了showall.html.erb。路线资源:products do get:showall end rake路线,我最终得到了product_showall get/products/:product_id/showall(:format)products#showall我如何摆脱product_id?如果这个答案解决了您的问题,你应该向上投票,并为评论中提到的上述问题创建新问题。它将保存您当前的问题以使其淡出,其他用户将能够从您的问题中获益。您可以在这里添加新问题的URL,以便我们可以帮助您。谢谢提醒。关于如何修改url模式的另一个问题。谢谢
    class ProductsController < ApplicationController
      def index
        if params[:user_id]
          @user = User.find(params[:user_id])
          @products = @user.products.all
        else
          @products = Product.all
        end
      end
    end