Ограничить attr_accessible типами пользователей с Ruby on Rails

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

Коды дезинфицируются, чтобы отображать только актуальную информацию.

Модели

class User < ActiveRecord::Base
  attr_accessible :name, :email, :password, :password_confirmation, :bio
  has_many :topics, dependent: :destroy
end

class Topic < ActiveRecord::Base
  belongs_to :user
  attr_accessible :name, :last_post_id, :content
end

Схема для пользователя: столбцы admin и mod определяют администраторов и модов.

create_table "users", :force => true do |t|
  t.string   "name"
  t.string   "email"
  t.datetime "created_at",                         :null => false
  t.datetime "updated_at",                         :null => false
  t.string   "password_digest"
  t.string   "remember_token"
  t.boolean  "admin",           :default => false
  t.text     "bio"
  t.boolean  "mod",             :default => false
end

Схема для темы: закрытый столбец определяет закрытый статус темы.

create_table "topics", :force => true do |t|
  t.datetime "created_at",                      :null => false
  t.datetime "updated_at",                      :null => false
  t.integer  "forum_id"
  t.string   "name"
  t.integer  "last_post_id"
  t.integer  "views"
  t.integer  "user_id"
  t.boolean  "closed",       :default => false
  t.text     "content"
end

Я не хочу использовать пользователя attr_accessible :closed для модели TOPIC, потому что он будет уязвим для вредоносного запроса PUT (поправьте меня, если я ошибаюсь).

Есть ли какой-то способ для приложения Rails получить доступ и изменить значение столбца closed TOPIC без использования attr_accessible, чтобы только моды и администраторы могли их редактировать?


person Jason Kim    schedule 02.07.2012    source источник


Ответы (1)


Я искал в Google и нашел это приведение ascii.

По сути, вы ищете динамический attr_accessible.

Если у вас в настоящее время

class Article < ActiveRecord::Base  
  attr_accessible :name, :content, :closed  
end  

Вы можете использовать динамический attr_accessible следующим образом:

class Article < ActiveRecord::Base  
  attr_accessible :name, :content  
  private  
  def mass_assignment_authorizer  
    super + [:closed]  
  end  
end  

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

person Justin D.    schedule 02.07.2012