Использование проверок рельсов для определения представлений - PullRequest
3 голосов
/ 09 декабря 2011

Итак, я принял толстую модель тощего контроллера близко к сердцу.

Я перенес много проверок (т. Е. На создание нового объекта) с контроллера на модель с использованием проверок. Есть ли способ использовать мой теперь надежный набор проверок из контроллера, чтобы определить, что должно отображаться в моих представлениях? Я думаю:

# in the controller
@item = Item.new if valid?

# then in the view:
<% if @item %><%= #button to create new item %>...

Другой вариант использования:

<% if @comment.valid? %><div class="new comment"></div><% end %>

Мне нужно будет передать «фиктивные» значения для некоторых полей, чтобы получить подтверждение для прохождения, но Меня больше всего беспокоит то, разрешено ли пользователю делать такие «набивки» 1012 *. Извините за философский вопрос, но какая здесь лучшая практика?

Обновление

Вот пример проверки разрешения, которое у меня есть. Я хотел бы остаться СУХИМ и использовать это вместо копирования и вставки в контроллер, если это возможно.

class Comment < ActiveRecord::Base

  belongs_to :user
  belongs_to :commentable, :polymorphic => true
  validate :user_can_comment, :if => :user

  def user_can_comment
    errors.add(:user, "can't comment") unless (user.is_photographer || user.id == commentable.user_id)
  end

end

Ответы [ 2 ]

1 голос
/ 11 декабря 2011

Похоже, вы смешиваете здесь проблемы. Валидации не предназначены для контроля доступа. Действительные пользователи могут иметь или не иметь доступ к определенным частям приложения, недопустимые пользователи никогда не должны создаваться в первую очередь. Недействительные пользователи существуют, но только во время рендеринга формы с сообщениями об ошибках. Они никогда не сохраняются.

Validations

Самый простой контроллер лесов в рельсах покажет вам, как должен выглядеть контроллер.

# Example of registration form

class UsersController < ApplicationController

  def new
    @user = User.new
  end

  def create
    @user = User.new(params[:user])

    if @user.save
      redirect_to root_url, notice: 'Welcome!'
    else
      render :new
    end
  end
end

В приведенном выше коде обратите внимание на строку с надписью render :new. Вот что происходит, когда @user не может быть сохранено. Почему не мог? Потому что проверки не пройдены. Как вы знаете, какие проверки не удалось? Глядя на @user.errors, который заполняется для вас. Вот почему мы делаем, а не перенаправляем. Как только вы перенаправите, массив @user.errors больше не будет существовать. Так что, на ваш взгляд, вы просто должны пройтись по @user.errors.full_messages и красиво отобразить их.

Права доступа

Разрешения - это совсем другая история. Если ваши пользователи могут быть, скажем, администраторами, то в вашей таблице пользователей, вероятно, есть логический столбец с именем admin. Это автоматически даст вам метод @user.admin?. В ваших контроллерах и представлениях у вас будет current_user в зависимости от сеанса, поэтому вы можете использовать current_user.admin?. Многие люди делают следующее в своем ApplicationController.

class ApplicationController < ActionController::Base
  # ...

  helper_method :admin?

  def admin?
    current_user.present? && current_user.admin?
  end
end

Это даст всем вашим контроллерам и представлениям метод, называемый admin?, который вы можете использовать, чтобы определить, может ли пользователь получить доступ к чему-либо. Более сложные разрешения требуют использования ролей. Есть хорошая библиотека под названием CanCan от Райана Бейтса, которая может помочь с этим.

1 голос
/ 11 декабря 2011

Похоже, что вы хотите, это Presenter Pattern . Это поможет вам очистить логику сложного представления в объект презентатора.

Существует также очень изящная жемчужина, которая поможет вам использовать этот шаблон: Draper . Не забудьте также проверить Railscast на эту тему: http://railscasts.com/episodes/286-draper

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