Rails 4에서 attr_accessible은 어떻게 사용됩니까?


258

attr_accessible 내 모델에서 더 이상 작동하지 않는 것 같습니다.

Rails 4에서 대량 할당을 허용하는 방법은 무엇입니까?

답변:


447

Rails 4는 이제 강력한 매개 변수를 사용합니다 .

이제 속성이 컨트롤러에서 보호됩니다. 이것은 예입니다 :

class PeopleController < ApplicationController
  def create
    Person.create(person_params)
  end

  private

  def person_params
    params.require(:person).permit(:name, :age)
  end
end

attr_accessible더 이상 모델 을 설정할 필요가 없습니다.

다루기 accepts_nested_attributes_for

accepts_nested_attribute_for강력한 매개 변수와 함께 사용하려면 허용 할 중첩 속성을 지정해야합니다.

class Person
  has_many :pets
  accepts_nested_attributes_for :pets
end

class PeopleController < ApplicationController
  def create
    Person.create(person_params)
  end

  # ...

  private

  def person_params
    params.require(:person).permit(:name, :age, pets_attributes: [:name, :category])
  end
end

키워드는 설명이 필요하지만 Rails Action Controller 안내서에서 강력한 매개 변수 대한 자세한 정보를 찾을 수 있습니다 .

참고 : 계속 사용 attr_accessible하려면에 추가 protected_attributes해야합니다 Gemfile. 그렇지 않으면, 당신은 직면하게됩니다 RuntimeError.


1
문서는 attr_accessible제거해야 한다고 말하지 않았습니다 . 보관하면 어떻게 되나요?
lulalala

12
Gemfile을 약간 조정하지 않으면 오류가 발생합니다. RuntimeError in MicropostsController#index 'attr_accessible' is extracted out of Rails into a gem. Please use new recommended protection model for params(strong_parameters) or add 'protected_attributes' to your Gemfile to use old one.
사용자

6
좋은 설명입니다. 실제로 이것은 레일을 뚱뚱한 모델, 얇은 컨트롤러 등에서 벗어나 얇은 모델, 실제로 부풀어 오른 컨트롤러로 이동시킵니다. 모든 인스턴스에 대해이 모든 것을 작성해야하며 잘 읽지 않으며 중첩은 고통스러워 보입니다. 모델 시스템의 이전 attr_accessible / attr_accessor는 손상되지 않았으므로 수정하지 않아도됩니다. 이 경우 하나의 블로그 게시물이 너무 인기를 얻었습니다.
rcd

1
컨트롤러에서 허용 된 매개 변수를 처리 할 필요는 없습니다. 사실 그것은 단일 책임 원칙을 위반하는 것입니다. 다음 블로그 게시물을 살펴보세요 edelpero.svbtle.com/strong-parameters-the-right-way을
피에르 - 루이 Gottfrois에게

3
그래서 gimmiky & 자주 바뀌는 apis, 새로 발견 된 pedantics와 함께 또 다른 고통스러운 Rails 업그레이드에서 많은 개발자 시간을 낭비합니다 :-(
Brian Takita

22

attr_accessible을 선호한다면 Rails 4에서도 사용할 수 있습니다. gem처럼 설치해야합니다 :

gem 'protected_attributes'

그 후 Rails 3과 같은 모델에서 attr_accessible을 사용할 수 있습니다

또한 대량 할당을 처리하고 중첩 된 객체를 저장하기 위해 양식 객체를 사용하는 가장 좋은 방법이라고 생각합니다. 또한 protected_attributes gem을 사용할 수 있습니다

class NestedForm
   include  ActiveModel::MassAssignmentSecurity
   attr_accessible :name,
                   :telephone, as: :create_params
   def create_objects(params)
      SomeModel.new(sanitized_params(params, :create_params))
   end
end

1
'강력한 매개 변수'를 사용하면 컨트롤러 계층에서 매개 변수를 필터링하며 이것이 모든 응용 프로그램에 가장 적합하다고 생각하지 않습니다. 나를 위해 매개 변수를 필터링하는 가장 좋은 방법은 추가 레이어를 사용하는 것입니다. 그리고 'protected_attributes'gem을 사용하여이 레이어를 작성할 수 있습니다
edikgat

4

사용할 수있다

params.require(:person).permit(:name, :age)

person이 Model 인 경우, person_params 메소드에서이 코드를 전달하고 create 메소드 또는 else 메소드에서 params [: person] 대신 사용하십시오.


2

Rails 5 업데이트 :

gem 'protected_attributes' 

더 이상 작동하지 않는 것 같습니다. 그러나 줘 :

gem 'protected_attributes_continued'

시도.


1

1) 애플리케이션의 Gemfile에 다음 줄을 추가하여 Rails 4.0을 처리 할 수 ​​있도록 Devise를 업데이트하십시오.

gem 'devise', '3.0.0.rc' 

그런 다음 다음을 실행하십시오.

$ bundle

2) 이전 기능 attr_accessible을 레일스 4.0 에 다시 추가

attr_accessible이것을 사용 하고 주석 처리하지 마십시오.

이 줄을 응용 프로그램의 Gemfile에 추가하십시오.

gem 'protected_attributes'

그런 다음 다음을 실행하십시오.

$ bundle
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.