ActiveScaffold скрыть поля в форме обновления на основе данных записи - PullRequest
1 голос
/ 26 апреля 2011

У меня есть приложение Rails, которое использует activescaffold, и я хотел бы скрыть некоторые поля в обновлении для некоторых записей.

Я пытался сделать это с помощью вспомогательных методов, но я не могу заставить это работать.

Каков наилучший способ сделать это?

Ответы [ 3 ]

2 голосов
/ 24 февраля 2012

Если вы просто хотите скрыть некоторые столбцы в представлении обновлений, то настроить их в контроллере довольно просто.

Либо вы можете указать столбцы, которые хотите видеть:

class DocumentsController < ApplicationController
  active_scaffold :document do |config|
    config.columns = [ :id, :product, :title, :document_type, :author, :organization, :document_approver, :document_location ]
    config.list.columns = [ :id, :product, :title, :document_type, :author ]
    config.show.columns = [ :product, :title, :document_type, :author, :organization, :document_approver, :document_location ]
    config.create.columns = [ :product, :title, :document_type, :document_approver, :document_location ]
    config.update.columns = [ :product, :title, :document_type, :organization, :document_approver, :document_location ]
  end
end

Или вы можете исключить те, которые хотите скрыть:

class DocumentsController < ApplicationController
  active_scaffold :document do |config|
    config.columns = [ :id, :product, :title, :document_type, :author, :organization, :document_approver, :document_location ]
    config.list.columns.exclude :organization, :document_approver, :document_location
    config.show.columns.exclude :id
    config.create.columns.exclude :id, :author, :organization
    config.update.columns.exclude :id, :author
  end
end

Обратите внимание, что config.columns используется для определения общего количества столбцов для контроллера и, если есть, списка',' show ',' create 'или' update 'специально не определены, тогда по умолчанию используется config.columns.

Это также означает, что если вы хотите, чтобы одинаковые столбцы были видны для всех представленийкроме «обновления», вы можете просто определить его следующим образом:

class DocumentsController < ApplicationController
  active_scaffold :document do |config|
    config.columns = [ :id, :product, :title, :document_type, :author, :organization, :document_approver, :document_location ]
    config.update.columns = [ :product, :title, :document_type, :organization, :document_approver, :document_location ]
  end
end

Или:

class DocumentsController < ApplicationController
  active_scaffold :document do |config|
    config.columns = [ :id, :product, :title, :document_type, :author, :organization, :document_approver, :document_location ]
    config.update.columns.exclude :id, :author
  end
end
2 голосов
/ 30 апреля 2011

Лучший способ сделать это - использовать один из шаблонов методов безопасности (в зависимости от ваших потребностей), предоставляемых плагином activescaffold.

Вставлено из вики activescaffold:

МодельМетоды: что-либо еще ограничено

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

Форматы:

* #{column_name}_authorized_for_#{crud_type}?

Например, если у вас есть контроллер на основе activescaffold с именем user:

class Admin::UsersController < ApplicationController
  active_scaffold do |config|
    config.columns = [:username, :name, :email]
  end
end

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

Модель пользователя:

class User < ActiveRecord::Base

  # ActiveScaffold security template: #{column_name}_authorized_for_#{crud_type}?
  def username_authorized_for_update?
    # As soon as this method will return false 
    # the username field will not be available on the update form
    return true # Write logic to decide if username field should be visible
  end
end

Активная ссылка на Scaffold вики: https://github.com/activescaffold/active_scaffold/wiki/Security

0 голосов
/ 18 октября 2011

Ответ whizcreed является правильным, и эти методы модели безопасности ActiveScaffold фактически оцениваются для каждой записи, поэтому вы можете сделать что-то подобное в модели:

def username_authorized_for_update?
  return true unless existing_record_check?
  return false if userrights != 'admin'
  return true
end

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

...