code

attr_accessor와 attr_accessible의 차이

starcafe 2023. 6. 12. 21:37
반응형

attr_accessor와 attr_accessible의 차이

레일에서 다음과 같은 차이점은 무엇입니까?attr_accessor그리고.attr_accessible가 알기로는, 가알는로것은, 는하용기를 사용하는 것으로 알고 .attr_accessor변수에 및 를 만드는 데 되므로 변에 대게 세방만법을드데터는변있다사수와 같은 수 .Object.variable또는Object.variable = some_value.

는 그것을 .attr_accessible특정 변수를 외부에서 액세스할 수 있도록 합니다. 수 있나요?

attr_accessor는 게터와 세터를 만드는 루비 방식입니다. attr_accessible는 대량할 수 입니다. Rails는 다음과 같습니다.new(attrs)또는update_attributes(attrs).

여기 대량 과제가 있습니다.

Order.new({ :type => 'Corn', :quantity => 6 })

당신은 그 주문에 할인 코드가 있을 수도 있다고 상상할 수 있습니다.:price_off태그를 지정하지 않으면:price_off~하듯이attr_accessible 것을 수 : 성코드가다같악음작수합수니다없도록행할업을은과▁code▁you.

Order.new({ :type => 'Corn', :quantity => 6, :price_off => 30 })

▁for▁field도경▁doesn에우▁a▁▁form▁your▁if:price_off모델에 있는 경우 기본적으로 사용할 수 있습니다.이는 조작된 POST가 여전히 설정할 수 있음을 의미합니다.용사를 합니다.attr_accessible화이트는 대량 할당할 수 있는 항목을 나열합니다.

이 스레드와 구글의 많은 사람들은 매우 잘 설명합니다.attr_accessible대량 업데이트가 허용되는 특성의 화이트리스트를 지정합니다(개체 모델의 모든 특성을 동시에 함께 업데이트).이는 주로 "대량 할당" 해적 공격으로부터 응용 프로그램을 보호하기 위한 것입니다.

이것은 여기 공식 레일즈 문서: 대량 할당에 설명되어 있습니다.

attr_accessor클래스에서 세터 및 게터 메서드를 (빠른) 생성하기 위한 루비 코드입니다.이상입니다.

식으로든 할 때 , Need가 입니다.attr_accessor모델에서 테이블의 레코드를 수정할 수 있도록 세터와 게터를 만듭니다.

이는 모형이 다음에서 모든 방법을 상속하기 때문입니다.ActiveRecord::Base클래스 - 사용자에 대한 기본 CRUD 액세스 권한(작성, 읽기, 업데이트, 삭제)을 이미 정의합니다.이에 대한 설명은 공식 문서 Rails Model(레일 모델)과 여기에서 기본 접근자 덮어쓰기("기본 접근자 덮어쓰기" 장으로 스크롤 다운)

예를 들어, "사용자"라는 데이터베이스 테이블에는 "이름", "성" 및 "역할" 세 개의 열이 포함되어 있습니다.

SQL 지침:

CREATE TABLE users (
  firstname string,
  lastname string
  role string
);

당신이 선택권을 설정했다고 생각했어요config.active_record.whitelist_attributes = true대량 할당 악용으로부터 응용 프로그램을 보호하기 위해 config/환경/production.rb에서 사용할 수 있습니다.여기서는 대량 할당에 대해 설명합니다.

레일 모델은 아래 모델과 완벽하게 연동됩니다.

class User < ActiveRecord::Base

end

그러나 양식의 보기가 작동하려면 컨트롤러에서 사용자의 각 속성을 개별적으로 업데이트해야 합니다.

def update
    @user = User.find_by_id(params[:id])
    @user.firstname = params[:user][:firstname]
    @user.lastname = params[:user][:lastname]

    if @user.save
        # Use of I18 internationalization t method for the flash message
        flash[:success] = t('activerecord.successful.messages.updated', :model => User.model_name.human)
    end

    respond_with(@user)
end

이제 여러분의 삶을 편하게 하기 위해, 여러분은 사용자 모델을 위한 복잡한 컨트롤러를 만들고 싶지 않을 것입니다.그래서 당신은 그것을 사용할 것입니다.attr_accessible모델의 : 다음과 같습니다.

class User < ActiveRecord::Base

  attr_accessible :firstname, :lastname

end

따라서 "고속도로"(질량 할당)를 사용하여 다음을 업데이트할 수 있습니다.

def update
    @user = User.find_by_id(params[:id])

    if @user.update_attributes(params[:user])
        # Use of I18 internationlization t method for the flash message
        flash[:success] = t('activerecord.successful.messages.updated', :model => User.model_name.human)
    end

    respond_with(@user)
end

role"을 ""에 attr_accessible 다니합로록으문에기사용자할: 다른 특별 관리 가 직접 합니다.이 작업은 다른 특수 관리 보기에서 직접 수행합니다.

사용자 보기에 "역할" 필드가 표시되지 않더라도, 해적은 매개 변수 해시에 "역할"이 포함된 HTTP POST 요청을 쉽게 보낼 수 있습니다. " 할이누 " 었되습 " " attr_accessible응용프로그램을 보호하기 위한 것입니다.

아래와 같이 user.role 특성을 자체적으로 수정할 수 있지만 모든 특성을 함께 사용할 수는 없습니다.

@user.role = DEFAULT_ROLE

대체 왜 그걸 사용하는 거지?attr_accessor?

사용자 양식이 사용자 표에 없는 필드를 열로 표시하는 경우입니다.

예를 들어, 사용자 보기에 "관리자에게 알려주세요" 필드가 표시된다고 가정합니다.이 정보를 테이블에 저장하지 않을 수 있습니다.당신은 단지 레일즈가 당신에게 한 "미친";-) 사용자가 가입했음을 경고하는 이메일을 보내기를 원할 뿐입니다.

이 정보를 활용하려면 이 정보를 임시로 어딘가에 저장해야 합니다.빠른 시간 내에 복구하는 것보다 더 쉬운 것은 무엇입니까?user.peekaboo성속?

이 필드를 모델에 추가합니다.

class User < ActiveRecord::Base

  attr_accessible :firstname, :lastname
  attr_accessor :peekaboo

end

그래서 당신은 교육적으로 그것을 사용할 수 있을 것입니다.user.peekaboo컨트롤러의 어딘가에서 전자 메일을 보내거나 원하는 대로 할 수 있습니다.

때에 ".user.save모델에서 이 이름과 일치하는 열이 보이지 않기 때문입니다.

attr_accessor는 동일한 이름의 인스턴스 변수에 setter 메서드와 getter 메서드를 제공하는 Ruby 메서드입니다.그래서 그것은 다음과 같습니다.

class MyModel
  def my_variable
    @my_variable
  end
  def my_variable=(value)
    @my_variable = value
  end
end

attr_accessible는 대량 할당에서 설정할 수 있는 변수를 결정하는 Rails 메서드입니다.

당신이 양식을 제출하고, 당신이 다음과 같은 것을 가지고 있을 때.MyModel.new params[:my_model]그러면 여러분은 사람들이 여러분이 원하지 않는 것들을 제출하지 못하도록 조금 더 통제력을 갖기를 원합니다.

할 수도attr_accessible :email다른 사용자가 계정을 업데이트할 때 전자 메일 주소를 변경할 수 있습니다.하지만 당신은 하지 않을 것입니다.attr_accessible :email, :salary왜냐하면 사람들은 양식 제출을 통해 그들의 급여를 정할 수 있기 때문입니다.다시 말해서, 그들은 임금 인상의 길을 갈 수 있습니다.

그런 종류의 정보는 명시적으로 처리되어야 합니다.양식에서 제거하는 것만으로는 충분하지 않습니다.누군가가 파이어버그와 함께 들어가서 급여 필드를 제출하기 위해 양식에 요소를 추가할 수 있습니다.그들은 내장된 컬을 사용하여 컨트롤러 업데이트 방법에 새 급여를 제출할 수 있으며, 해당 정보로 게시물을 제출하는 스크립트를 만들 수 있습니다.

그렇게attr_accessor변수를 저장하는 방법을 만드는 것입니다.attr_accessible대량 과제의 보안에 관한 것입니다.

attr_accessor루비 코드이며 데이터베이스에 열이 없지만 양식에 필드를 표시하려는 경우에 사용됩니다.이것을 허용하는 유일한 방법은attr_accessor :fieldname원하는 경우 이 필드를 보기 또는 모델에서 사용할 수 있지만 대부분 보기에서 사용할 수 있습니다.

다음 예를 생각해 보겠습니다.

class Address
    attr_reader :street
    attr_writer :street  
    def initialize
        @street = ""
    end
end

여기서 우리는 사용했습니다.attr_reader(읽기 가능한 속성) 및attr_writer(임의 속성) 액세스 목적에 사용할 수 있습니다.그러나 다음을 사용하여 동일한 기능을 달성할 수 있습니다.attr_accessor간단히 말해서, attr_accessor는 getter 메서드와 setter 메서드 모두에 대한 액세스를 제공합니다.

그래서 수정된 코드는 아래와 같습니다.

class Address
    attr_accessor :street  
    def initialize
        @street = ""
    end
end

attr_accessible대량 할당을 허용할 모든 열을 나열할 수 있습니다.은 이와반는것은입니다.attr_protected그 말은 이 분야는 누구도 대량 할당하지 말라는 뜻입니다.데이터베이스에 있는 필드는 다른 사용자가 장난치는 것을 원치 않을 가능성이 높습니다.상태 필드 등입니다.

두 마디로:

attr_accessor이라getter,setter방법.특정 속성에 접근할 수 있는지 없는지를 말하는 것입니다. 그게 다입니다.


나는 우리가 대신 스트롱 매개 변수를 사용해야 한다는 것을 추가하고 싶습니다.attr_accessible대량 할당으로부터 보호합니다.

건배!

빠르고 간결한 차이점 개요:

attr_accessor클래스에서 읽기 및 쓰기 액세스 프로그램을 쉽게 만들 수 있습니다.데이터베이스에 열이 없지만 양식에 필드를 표시하려는 경우 사용됩니다.는 이필는입니다.“virtual attribute”레일즈 모델에서.

가상 특성 – 데이터베이스의 열에 해당하지 않는 특성입니다.

attr_accessible는 컨트롤러 메서드에서 액세스할 수 있는 속성을 식별하는 데 사용되며 속성을 대량 수집할 수 있습니다.사용자가 지정한 특성에 대한 액세스만 허용하고 나머지는 거부합니다.

언급URL : https://stackoverflow.com/questions/3136420/difference-between-attr-accessor-and-attr-accessible

반응형