Подтверждение права собственности на присвоенную массу модели с использованием мелких маршрутов - PullRequest
1 голос
/ 10 января 2012

У меня есть вложенный маршрут для двух моделей, например:

resources :books do
  resources :chapters, :shallow => true
end

, и я хочу иметь возможность иметь вложенную форму для глав книги.

как проверитьчто каждая масса назначенных глав глав принадлежит пользователю.

Я пытался добавить ее в контроллер следующим образом:

class ChaptersController < ApplicationController
  before_filter :check_ownership_of_chapters_book

  def check_ownership_of_chapters_book
    if Book.find(params[:book_id]).author != current_user
      flash[:error] = "You are not the author of the book you are adding the chapter to"
      redirect_to root_url
    end
  end

  ...

выдает эту ошибку

"Не удалосьнайти книгу без идентификатора "

, поскольку идентификатор книги не передается в параметре.

, но я думаю, может быть, мне следует выполнить эту проверку в модели (чтобы проверить, чтокнига, в которую вставлена ​​глава, принадлежит пользователю current_user)

1 Ответ

0 голосов
/ 09 августа 2015

Я решил это с помощью такой конструкции (и у меня есть более глубокое вложение ресурсов, таких как Author -> book -> page, Author -> picture, ...):

class ChaptersController < SecurityController < ApplicationController

(простологика)

, где AppController управляет чек-вызовом, а SecurityController обрабатывает «чек-чек» следующим образом (я хочу как можно меньше использовать AppicationController

class  AppicationController
    #check-call
    before_filter do 
        raise SiteForbiddenException.new(foo) unless check_permissions 
    end
end


class SecurityController < ApplicationController

    def check_permissions
        false
    end

     #check-check
    def check_permission_from(id_val)
        id_val={ page_id: Pageelement.find(id_val[:pageelement_id]).page_id } if id_val[:pageelement_id]
        id_val={ book_id: Page.find(id_val[:page_id]).book_id } if id_val[:page_id]

        if id_val[:book_id]
            return true if  ... check author from book_id ok 
        end
        raise SiteForbiddenException.new(foo) unless check_permissions 
    end

 end

и

class PageController < SecurityController   
    def check_permissions
        return true if action_name=='public'
        check_permission_from(page_id: params[:page_id])
    end
end 

Поэтому, если я забуду def check_permissions ... в PageController, я получу исключение

И я могу использовать check_permission_from(page_id: @page_id) (или около того) с любого другого контроллера, если это необходимо (например, переместить).страница из одной книги в другую)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...