[ruby-on-rails] Rails 4에서 attr_accessible은 어떻게 사용됩니까?

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

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



답변

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.


답변

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


답변

사용할 수있다

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

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


답변

Rails 5 업데이트 :

gem 'protected_attributes' 

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

gem ‘protected_attributes_continued’

시도.


답변

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


답변