【发布时间】:2018-07-28 18:24:54
【问题描述】:
这个问题指的是this具体问题。
我使用 pundit 作为我的授权 gem,我希望用户 X 只能下载属于用户 X 的用户信息。现在我有 http://localhost:3000/download.csv 作为我的链接来接收用户信息。但是如果我登录到另一个用户,例如 user/2,我仍然可以输入 url 并下载 user/3 数据。
我现在拥有的:
user_policy.rb
class UserPolicy < ApplicationPolicy
def profile?
true
end
def download?
end
private
def user_or_admin
user.id == record.id || user.admin?
end
end
application_policy.rb
class ApplicationPolicy
attr_reader :user, :record
def initialize(user, record)
@user = user
@record = record
end
def index?
false
end
def show?
scope.where(:id => record.id).exists?
end
def create?
create?
end
def new?
create?
end
def update?
false
end
def edit?
update?
end
def destroy?
false
end
class Scope
attr_reader :user, :scope
def initialize(user, scope)
@user = user
@scope = scope
end
def resolve
scope.all
end
end
end
这是我的 user_controller.rb # 这不是 users_controller,那是不同的视图
class UserController < ApplicationController
prepend_view_path(File.join(Rails.root, 'app/views/user/'))
layout 'application'
def index
end
def billing
end
def plan
end
def profile
@user = User.find(params[:id])
@user_posts = @user.posts.order('created_at DESC')
end
end
def download
@user = User.find(params[:id])
respond_to do |format|
format.html
format.csv { send_data @user.csv, filename: "userinfo-#{Date.today}.csv" }
end
end
def support
@user = User.find(params[:id])
@user_posts = @user.posts.order('created_at DESC')
end
def notifications
end
def show
@user = User.find(params[:id])
@posts = current_user.posts.order('created_at DESC')
@user_posts = @user.posts.order('created_at DESC')
end
更新:按照建议,我尝试在我的 user_controller 中实现新的下载操作,并尝试在我的视图中使用此代码:
<p><%= link_to("Export data as CSV", download_path(@user, format: :csv), { :controller => :user, :action => :download }, class: "btn btn-success") %></p>
但这会引发以下错误:
接收未知操作 - 找不到 UserController 的操作“下载”
routes.rb
Rails.application.routes.draw do
get 'legal/privacy'
get :datenschutz, to: 'legal#terms_of_service'
devise_for :users, path_names: { sign_in: 'login', sign_out: 'logout', sign_up: 'registrieren', edit: 'bearbeiten' }, :controllers => { registrations: 'registrations' }
get '/users/mitteilungen/:id' => 'user#notifications'
get '/users/:id/artikel/', :to => 'user#support', :as => :artikel
get '/users/plan' => 'user#plan'
get '/users/billing' => 'user#billing'
get '/users/:id', :to => 'user#profile', :as => :user
get 'download', :to => 'user#download', :controller => :user, action: :download, :as => :download
resources :posts, path: :news do
resources :comments, path: :kommentare do
end
end
devise_scope :user do
resources :posts, path: :news do
resources :comments do
end
end
end
root to: "posts#index", as: :root
end
【问题讨论】:
-
您可以将 csv 下载分离到另一个控制器操作/路由(类似于
download),然后使用策略中的download?方法从profile显示单独授权。 -
我在用户控制器中创建了一个下载操作,我如何告诉我的 link_to 使用它?
:user, :action => :download }, class: "btn btn-success" ) %>
似乎不起作用 -
您必须创建一个指向您的下载操作的自定义路由。如果你坚持下去,我会写一个答案。
-
我创建了以下路由 get 'download', :to => 'user#download',但是单击按钮后,我得到了 UserController 的操作 'download' could not be found for UserController。另外我必须删除 class 参数,因为我只能允许 3 个参数,我将如何解决这个问题?感谢您帮助我!
-
请发布您的 routes.rb
标签: ruby-on-rails pundit