2014-01-30 4 views
0

Я получил эти три нижних маршруты ниже, которые очень подвержены ошибкам из-за другие маршруты, объявленных обычно:Rails: половина успокоительных маршруты

# 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

ошибка склонна? что? – phoet

ответ

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]) 

Предполагая, что вы находитесь на последней Рельсы версии, иначе:

User.find_by_client_code(params[:client_code]) 

Позвольте мне знать, для чего нужны акции, я не уверен, что предоставил вам полное решение.

Cheers.

EDIT

если вы используете акции, чтобы обеспечить различные точки зрения, я предлагаю сделать это:

В контроллере

def index 
    if params[:shares] 
    render 'shares' 
    end 
end 

Если вы действительно хотите иметь другой маршрут Это. Это позволяет вам не иметь контроллер акций по существу, что такое модель документа.

+0

Спасибо за ваш вдумчивый ответ. «Акции» существуют как другое представление для «Документов». Некоторое время код был, но не уверен, что это очень хороший способ отправить пользователей в другой формат «Документ». –

Смежные вопросы