2015-06-11 2 views
7

Я просто делал немного чтения на attr_accessor, attr_accessible и сильных параметров в нескольких разных местах:Разница между attr_accessible и сильными параметрами

Difference between attr_accessor and attr_accessible
How is attr_accessible used in Rails 4? http://edgeapi.rubyonrails.org/classes/ActionController/StrongParameters.html

И я смотрю на массовое назначение:

http://code.tutsplus.com/tutorials/mass-assignment-rails-and-you--net-31695

Я не могу разглядеть разницу между attr_accessible и сильными параметрами. Я не уверен на 100% в моем понимании предметов, упомянутых выше, поэтому я мог бы пропустить что-то простое, но я знаю, что они выполняют аналогичную работу.

Однако в чем разница между attr_accessible и сильными параметрами? Разве это другое имя для одного и того же? Почему мы перешли от одного к другому?

Любая информация оценена.

ответ

14

attr_accessible устарел в Rails 4 в пользу сильных параметров.

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

В примере у вас есть модель User с атрибутами email:string и is_admin:boolean. Вы хотите разрешить пользователям изменять свою электронную почту через форму, но не поле is_admin.

В Rails 3 вы должны сделать:

attr_accesible :email 

При таком подходе это не возможно для пользователя, чтобы изменить is_admin, поскольку этот атрибут защищен.

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

def user_params 
    if current_user.admin? 
    params.require(:user).permit(:email, :is_admin) 
    else 
    params.require(:user).permit(:email) 
    end 
end 

Таким образом, один администратор пользователь сможет изменить is_admin в то время как обычный пользователь не будет.

Это всего лишь один пример и не лучший способ предоставить административные разрешения пользователю, но это довольно иллюстративно.

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

С другой стороны, attr_accessor - это совершенно другая вещь и все еще может использоваться в Rails 4, например, если вам нужен один атрибут в вашей модели, который не обязательно сохранять или записывать в базу данных, но вам это нужно в форме. Подумайте:

attr_accessor :has_accepted_legal_terms

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

5

Сильные параметры и attr_accessible - это два разных способа добавления защитных средств к функции «массового присвоения» Rails. Сильные параметры - это способ, который предписывается текущей версией Rails.

«Массовое присвоение» - это удобная стрижка в Rails, которая позволяет вам установить множество свойств модели в одном выражении.

Например, представьте, что у вас есть @user, который вы хотите обновить данными из представления формы. Без массового назначения, вам придется писать утомительный код, как это:

@user.first_name = params[:user][:first_name] 
@user.last_name = params[:user][:last_name] 
@user.phone_number = params[:user][:phone_number] 
... 
@user.save 

и так далее для каждого поля формы.

С массовым назначением, все, что код становится одной строкой:

@user.update(params[:user]) 

Но это дырявая безопасности. Так как params содержит все данные, предоставленные браузером, злоумышленник может добавлять данные к этому представлению, чего вы не ожидали. Например, они могут добавить к параметрам is_admin=1. Если у вас есть столбец базы данных is_admin, тогда массовое задание просто позволит пользователю перейти на администратора. Хлоп!

Здесь вы найдете сильные параметры. С сильными параметрами Rails поднимет ActiveModel::ForbiddenAttributesError, если вы попытаетесь сделать наивный update(params[:user]). Вместо этого вам нужно четко указать, какие параметры вы ожидаете от представления браузера, используя помощники require и permit, которые предоставляют сильные параметры. Например:

def user_params 
    # Note that :is_admin is not permitted! 
    params.require(:user).permit(:first_name, :last_name, :phone_number) 
end 

... 
@user.update(user_params) 

Я не могу говорить для сопровождающих Rails, но мне нравятся сильные параметры, потому что они гибкие. Если у меня есть несколько действий в контроллере пользователей, которые ожидают разные параметры, я могу легко описать с помощью permit параметры, которые должны быть разрешены.

Или, если у меня есть разные роли пользователей, которым разрешено обновлять разные атрибуты, я могу легко смоделировать эти разрешения. Как уже упоминалось в CV CV, вы даже можете изменить эти разрешения во время выполнения, что является мощным.

Короче говоря, гибкость сильных параметров обусловлена ​​тем, что вы можете определить способ user_params в любом месте и, как вам нравится. У вас есть все возможности концепций Ruby и OO, чтобы они работали так, как вы хотите.

Что относительно attr_accessible?

Не вдаваясь в излишние подробности (так как эта функция больше не поддерживается Rails): вместо того, чтобы использовать метод permit, вы могли бы сделать что-то подобное, используя attr_accessible макрос в самой модели, как это:

class User < ActiveRecord::Base 
    attr_accessible :first_name, :last_name, :phone_number 
    ... 
end 

Так что для простых случаев он очень похож на Сильные параметры; вы просто определяете список атрибутов в другом месте.

Однако, поскольку attr_accessible тесно связан с определением класса модели, вы теряете большую гибкость.Что делать, если у вас есть два разных действия контроллера, которые должны выполнять массовое присвоение для той же модели User? Теперь вы застряли.

attr_accessor

attr_accessor макрос встроен в Ruby, и не имеет ничего общего с Rails, массовое присвоение или безопасности. Это просто похоже на аналогичное имя. :)

Смежные вопросы