Rails:半休息的路线

时间:2014-01-30 04:03:36

标签: ruby-on-rails ruby-on-rails-3 rails-routing

由于正常声明的其他路线,我在下面有三条底部路线非常容易出错:

# 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的所有者。它有点像安全检查/所有权类型的功能。但是,由于上面列出的所有原因:有没有更好的方法来写这个?必须有一个比这更好的方法。

感谢。

1 个答案:

答案 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

除非你真的希望有不同的路线。这使您基本上没有文档模型的共享控制器。