Запретить просмотр для доступа к моделям

Чтобы обеспечить разделение проблем и предотвратить грязные взломы представлений большого проекта, я хотел бы ввести данные в представления (например, через контроллер), и тогда представление не могло бы получить доступ к моделям или любым другим объектам. класс проекта (только внедренная структура данных).

Как с помощью Rails предотвратить доступ встроенного кода Ruby в представления к другим частям проекта?

Да, это возможно. В моих проектах представления никогда не имеют доступа к моделям. Или любой другой Class в проекте, кроме единственного экземпляра класса Presenter.

jvillian 27.04.2018 15:52

Но как вам удается создать эту изоляцию @jvillian? Внедрить объект Presenter в представление просто, как пирог, но я не понимаю, как можно запретить представлению доступ к чему-либо.

Jean-Théo 27.04.2018 16:13

Ооооо. Вы хотите знать как? Вы должны были спросить что вместо Является ли это возможным?! Постой, я отправлю ответ.

jvillian 27.04.2018 16:33
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
47
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

ОК. Вот и все. (Это неполный код и предназначен для указания направления, я многое удалил, поэтому вам придется заполнить пробелы.)

Сначала я создаю модуль под названием ActsAs::Rendering. Это предоставляет экземпляр ActionView::Base, который является ключом к рендерингу в любом месте.

module ActsAs::Rendering
  private

    def action_view() @action_view ||= new_action_view end

    def new_action_view
      av = ActionView::Base.new
      av.view_paths = ActionController::Base.view_paths
      av.class_eval do
        include Rails.application.routes.url_helpers
        include ApplicationHelper
      end
      av
    end

    def method_missing(meth, *params, &block)
      if action_view.respond_to?(meth)
        action_view.send(meth, *params, &block)
      else
        super
      end
    end

    def render_partial(file_ref)
      render(partial: "#{file_ref}", locals: {presenter: self})
    end
end

Затем я создаю PresenterBase, который включает ActsAs::Rendering:

def PresenterBase
  include ActsAs::Rendering 

  class << self

    def present(args = {})
      new(args).present
    end

  end # Class Methods

  #==============================================================================================
  # Instance Methods
  #==============================================================================================

    def initialize(args)
      @args = args
    end

  private

end

А теперь я создаю класс Presenter, реализующий present.

def FooPresenter < PresenterBase 

  #==============================================================================================
  # Instance Methods
  #==============================================================================================

    def present
      render_partial 'path/to/foo/partial'
      # or do a lot of other cool stuff.
    end

end

И все мои взгляды начинаются с:

- @presenter = local_assigns[:presenter] if local_assigns[:presenter]

И теперь у представления больше нет доступа ни к чему, кроме своего ведущего.

* ПРИМЕЧАНИЕ *

Есть еще кое-что, но мне нужно выбежать. Я обновлю позже.

Другие вопросы по теме