Установка поля в Rails только для чтения после его создания - PullRequest
4 голосов
/ 26 сентября 2010

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

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

Есть ли способ сделать это в Rails? Могу ли я сначала установить его как attr_accessible, а затем переключить на attr_protected?

Приветствия

Ответы [ 5 ]

10 голосов
/ 26 сентября 2010

Вы можете добавить собственный метод проверки к вашей модели:

# Project model
validate_on_update :forbid_changing_name

def forbid_changing_name
  errors[:name] = "can not be changed!" if self.name_changed?
end
9 голосов
/ 11 апреля 2011

Как насчет установки только для чтения?Метод attr_readonly позволяет вам сделать это, см .:

Документы API

0 голосов
/ 26 сентября 2010

Если бы я сделал это, я сделаю это в клиентах и ​​использую javascripts.Пример: создайте функцию javascript, которая устанавливает атрибут текстового поля только для чтения после того, как пользователь введет значение.Как я вижу, это позволяет клиенту иметь 2 преимущества:

1 - вы не хотите проходить серверный раунд, чтобы заблокировать значение 2 - у вас есть возможность позволить пользователю изменить значение, еслиона хочет (нажав кнопку или что-то)

ура

sameera

0 голосов
/ 26 сентября 2010

Вы также можете, если вы знаете имя атрибутов, обработать это в контроллере

class MyModel < ActiveRecord::Base
  attr_protected :super_cool
end

А потом в контроллере:

def create
  @my_model = MyModel.create(params[:my_model])
  @my_model.super_cool = params[:my_model][:super_cool] unless params[:my_model].nil?
  if @my_model.save
    ..
  else
    ..
  end
end
0 голосов
/ 26 сентября 2010

Я бы установил его на: attr_protected и создал бы новый «новый» метод:

def self.my_new(attributes = {})
  obj = new(attributes)
  obj.my_protected_attribute = attributes[:protected_attribute]
  obj
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...