Как избежать установки `attr_accessible` и возврата логического значения из действия обновления - PullRequest
0 голосов
/ 06 февраля 2011

Я использую Ruby on Rails 3, и я хотел бы обновить ActiveRecord, избегая настройки attr_accessible, но возвращая логическое значение из метода обновления. Я знаю , что, чтобы избежать настройки attr_accessible, я могу использовать это

@user.send :attributes=, @attrib, false

, но это не возвращает логическое значение .


Мне это нужно, потому что я должен обрабатывать поведение обновления (когда метод обновления возвращает true) или ошибки (когда метод обновления возвращает false) в некотором роде так:

В модели:

class User < ActiveRecord::Base
  attr_accessible #none
  # or
  # attr_protected :name, :surname
end

В контроллере:

class UsersController < ApplicationController
  # The following is the behaviour that I would like to handle (it is just an example: it is wrong and doesn't work)
  if @user.send(:attributes=, { :name => params[:name], :surname => params[:surname] }, false) 
    ...
  else
    ...
  end
end

Возможно ли это?Если так, то как?Если нет, есть другой способ сделать это?

PS: Чтобы избежать инъекций AJAX, для меня важно обновить только ограниченное количество атрибутов и не обновлять@user ActiveRecord (см. Код в приведенном выше примере) вообще (может быть, я не должен использовать какой-либо метод, например "global" save).

Ответы [ 3 ]

2 голосов
/ 06 февраля 2011

Вызов attributes= с false еще ничего не обновляет, он просто устанавливает значения атрибута, игнорируя любой белый список attr_accessible.

Таким образом, вы можете просто позвонить save после этого, который вернет искомое логическое значение.

0 голосов
/ 11 января 2012

Правильный метод для обхода атрибутов, защищенных массовым назначением, - это использовать assign_attributes (доступно только в Rails 3.1 +).

См. http://apidock.com/rails/ActiveRecord/Base/assign_attributes

Вот пример:

user.assign_attributes({ :name => 'Joe' }, :without_protection => true)
0 голосов
/ 06 февраля 2011

Посмотрите на мой драгоценный камень sudo_attributes , он может предоставить вам необходимую функциональность. Я построил его, чтобы упростить обработку защищенных атрибутов, добавив методы "sudo", такие как @model.sudo_update_attributes(params[:model]), когда вы знаете, что можете доверять вводу. У README есть несколько примеров.

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