由于正常声明的其他路线,我在下面有三条底部路线非常容易出错:
# normal routes
resources :documents, :except => [:show, :edit, :update]
resources :photos, :except => [:show, :index]
...
# error-prone routes
get ":client_code" => "share#index", :as => :shares, :format => false
get ":client_code/:id" => "share#show", :as => :share, :format => false
get ":client_code/:document_id/more/:component_id" => "share#more", :as => :more, :format => false
我在ShareController
中有一些方法来处理这样的请求:
def show
get_user_by_parameter
if get_document_by_user_or_issue and @document.is_showable? and @parameter_user == @document.user
...
end
private
def get_user_by_parameter
@parameter_user = User.where(:client_code => params[:client_code]).first
end
def get_document_by_user_or_issue
if params[:id].match(/\D/)
@document = Document.where(:user_id => @user.id, :issue => params[:id]).first
else
@document = Document.find(params[:id])
end
end
我需要路由是最小的,但这不仅是丑陋而且非RESTful,但它非常容易出错。
:client_code
始终是正在查看的@document
的所有者。它有点像安全检查/所有权类型的功能。但是,由于上面列出的所有原因:有没有更好的方法来写这个?必须有一个比这更好的方法。
感谢。
答案 0 :(得分:1)
基于控制器的检查:
before_filter :find_document
def find_document
Document.find(params[:id])
end
def is_owner?(document)
redirect_to root_path if current_user.id != document.owner_id
end
这样的支票不是那么容易吗?我不知道为什么你有一个共享控制器,所以我不想在这里放肆。
允许您这样做:
resources :shares, only: [:index, :show]
此外:
User.where(:client_code => params[:client_code]).first
可以重构为:
User.find_by(client_code: params[:client_code])
假设您使用的是最新的rails版本,否则:
User.find_by_client_code(params[:client_code])
让我知道股票的用途,我不确定我是否为您提供了完整的解决方案。
干杯。
如果您使用共享提供不同的视图,我建议这样做:
在控制器内,
def index
if params[:shares]
render 'shares'
end
end
除非你真的希望有不同的路线。这使您基本上没有文档模型的共享控制器。