Ruby on rails Ruby Rails路径按用户显示所有项
这里有一个RoR初学者。我正在尝试实现一个页面“我的产品”,以显示当前用户添加的所有产品。目前,我已将我的“所有产品”页面设置为我的索引根“产品#索引”。我的产品有控制器,但我的用户没有控制器,因为我使用的是Desive。我有几个问题还没答对 因为现在 产品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
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
问题:
用户拥有多个:产品
,您需要使用正确的关联名称:
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