frontend и бэкенд должны быть обработаны различными контроллерами?

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

Во всех УСПОКОИТЕЛЬНЫХ учебных руководствах по направляющим контроллеры имеют a show, edit и index посмотреть. Если авторизованный пользователь зарегистрирован, edit представление становится доступным и index просмотрите показывает дополнительные средства управления манипулированием данными, как удалить кнопка или ссылка на edit посмотреть.

Теперь у меня есть приложение направляющих, которое точно следует этой модели, но index представление не является допускающим повторное использование:

  1. Обычный пользователь видит роскошную индексную страницу с большим количеством изображений, сложного макета, никакого требования JavaScript...
  2. Администраторский пользовательский индекс имеет completly другой минималистический дизайн, таблицу jQuery и много дополнительных данных...

Теперь я не уверен, как обработать этот случай. Я могу думать о следующем:

  1. Единственный контроллер, единственное представление: представление разделяется на два больших использования blocks/partials if оператор.
  2. Единственный контроллер, два представления: index и index_admin.
  3. Два различных контроллера: BookController и BookAdminController

Ни одно из этих решений не кажется прекрасным, но на данный момент я склонен использовать 3-ю опцию.

Что предпочтительный путь состоит в том, чтобы сделать это?

10
задан John Topley 1 May 2010 в 14:25
поделиться

4 ответа

Я задавал себе этот вопрос почти каждый раз, когда получаю новый проект. Обычно я выбираю одно из двух решений:

1). Единый контроллер, единое представление

Я почти никогда не выбираю это решение сейчас, за исключением случаев, когда проект действительно простой, и только для одного или двух типов пользователей. Если у вас есть несколько типов пользователей, лучше использовать решение №2. Хотя это решение может быть привлекательным, потому что вы думаете, что сэкономите себе время, написав меньше кода, но, в конце концов, ваш контроллер и представление будут усложняться. Не говоря уже обо всех крайних случаях, которые вам нужно учитывать. Обычно это означает ошибки.

Моей компании однажды пришлось спасать провальный проект, у него было 3 типа пользователей. (администратор, бизнес и участник). Они использовали решение №1. Код был в ужасном состоянии (и поэтому нас попросили спасти этот проект). Мы в шутку говорили, что это не MVC, а MMM. (Модель-Модель-Модель) Это связано с тем, что бизнес-логика не была должным образом извлечена и помещена в модели, но также распространилась на контроллеры и представления.

2). Несколько контроллеров, несколько представлений

В наши дни я все чаще и чаще использую это решение. Обычно я использую пространство имен контроллеров с пользовательскими типами. Например:

В «app / controllers»

class BookController < ApplicationController
end

и в «app / controllers / admin»

class Admin::BookController < Admin::BaseController
end

мне нужно учитывать только обычных пользователей, когда я заполняю BookController, и мне нужно учитывать только пользователей с правами администратора, когда я заполняю in Admin :: BookController

Я не уверен, есть ли лучшие способы, но это то, что я узнал из дюжины проектов, которые я реализовал на данный момент ...

15
ответ дан 3 December 2019 в 18:32
поделиться

То, что я делаю в такой ситуации, довольно сильно изменилось за последнее время. Текущий подход таков:

Я разделяю контроллеры на основе требований к доступу. Это дает мне четкую ментальную модель и очень простой способ проверки контроля доступа (и его тестирования).

Я даже зашел так далеко, что выделил "собственный доступ" к моделям в отдельный контроллер. Я также обычно сохраняю имя контроллера, просто помещаю его в отдельное пространство имен.

Такой подход также позволяет легко использовать стандартные рестуктивные реализации контроллеров, такие как InheritedReseses. реализации, такие как InheritedResources.

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

Таким образом, у меня будет что-то вроде этого:

### lets start with routes

# this is basically guest access level. you can only list it and see details
map.resources :books, :only => [:index, :show]

namespace :my do |my|
  # this will require at least login.
  # index and show will be basically same as at the guest level. we can reuse the views
  my.resources :books
end

namespace :admin do |admin|
  # this will require admin login
  admin.resources :books
end

# now the controllers

# this might be just enough of a controller code :). the rest goes into model.
class BooksController < InheritedResources::Base
  actions :index, :show
end

module My
  class BooksController < InheritedResources::Base
    before_filter :require_user

    protected
    def begin_of_association_chain
      # this will force resources to be found on current_user.books.
      # so if you go to /my/books/123 and book 123 is not your book you will get 404
      current_user
    end
  end
end

module Admin
  class BooksController < InheritedResources::Base
    before_filter :require_admin

    # this controller is essentially unrestricted. you can get/edit/update any book
    # and you can have separate view template for index too
  end
end



## Views
# well, this is the part that I like the least in this approach, but
# I think the good outweight the bad.
# I see 2 ways to reuse the views w/o writing lots of ugly customization code for the InheritedResources
# 1) render 'parent' views inside templates. i.e. like:
# my/books/index.html.haml:
!= render :file => "/books/index"

# or just link the templates on the filesystem level with symlinks.
# (or if all of them are the same you can link the directory)
3
ответ дан 3 December 2019 в 18:32
поделиться

Использовать два текущих, если есть два модуля 1] Администратор 2] Пользователь

Скажите

class BookUserController < ApplicationController
  #Here layout is used will be of layouts/application.html.erb
  #Here all the methods which user can will be present 
end


class BookAdminController < ApplicationController
  layout 'admin'  #here we set the layout is layouts/admin.html.erb 

end

ЕСЛИ Только одну страницу вы хотите показать администратору, вы можете используйте один контроллер и два метода

class BookUserController < ApplicationController
  layout 'admin', :only=>['index_admin']

  def index_admin


  end

  def index



  end


end

ИЛИ

class BookUserController < ApplicationController
  def index_admin

    render :action=>'index_admin', :layout => false
  end

  def index



  end


end
2
ответ дан 3 December 2019 в 18:32
поделиться

Когда мне нужна четко разделенная область администрирования, я предпочитаю решение с двумя контроллерами для одного ресурса. Admin :: BooksController в подкаталоге admin / для интерфейса администратора со всеми действиями и общедоступный BooksController, который имеет только методы index и show в зависимости от потребностей.

1
ответ дан 3 December 2019 в 18:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: