Attr_accessor এবং attr_accessable এর মধ্যে পার্থক্য


235

রেলগুলিতে, attr_accessorএবং এর মধ্যে পার্থক্য কী attr_accessible? আমার বোধগম্যতা থেকে, ব্যবহার করে attr_accessorসেই পরিবর্তনশীলটির জন্য গিটার এবং সেটার পদ্ধতি তৈরি করতে ব্যবহৃত হয়, যাতে আমরা চলকটির মতো Object.variableবা অ্যাক্সেস করতে পারি Object.variable = some_value

আমি পড়লাম যা attr_accessibleসেই নির্দিষ্ট পরিবর্তনকে বাইরের বিশ্বে অ্যাক্সেসযোগ্য করে তোলে। কেউ কি দয়া করে আমাকে পার্থক্য বলতে পারেন


4
আপনি ঠিক বলেছেন attr_accessorযা গেটর এবং সেটার পদ্ধতি উত্পন্ন করতে ব্যবহৃত হয়। এর একটি বিস্তৃত বিস্তৃত ব্যাখ্যার জন্য দয়া করে পূর্ববর্তী প্রশ্নের আমার উত্তরটি দেখুন attr_accessible: stackoverflow.com/questions/2652907/… তারপরে আপনার যদি অন্য কোনও নির্দিষ্ট বিবরণ প্রয়োজন হয় তবে আপনার প্রশ্নটি আপডেট করুন।
মাইকেজ

2
attr_accessible আর পাগল 4 সমর্থিত যদি না আপনি প্রতি শীর্ষ উত্তর হিসাবে চাই, protected_attributes মণি ব্যবহার stackoverflow.com/questions/17371334/... (জুলাই 2014)
Emery

উত্তর:


258

attr_accessorএকটি রুবি পদ্ধতি যা একটি গিটার এবং একটি সেটার তৈরি করে। attr_accessibleএকটি রেলস পদ্ধতি যা আপনাকে একটি ভর কার্যের ক্ষেত্রে মানগুলিতে স্থান দিতে দেয়: new(attrs)বা update_attributes(attrs)

এখানে একটি ভর কার্যনির্বাহী:

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

আপনি ধারণা করতে পারেন যে অর্ডারে একটি ছাড় কোডও থাকতে পারে, বলুন :price_off। আপনি যদি দূষিত কোডটি এমনটি করতে সক্ষম হন না কেন আপনি ট্যাগ :price_offকরেন না attr_accessible:

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

এমনকি যদি আপনার ফর্মের ক্ষেত্রে ক্ষেত্র না থাকে :price_offতবে এটি যদি আপনার মডেলটিতে থাকে তবে এটি ডিফল্টরূপে উপলব্ধ। এর অর্থ একটি কারুকৃত পোষ্ট এখনও সেট করতে পারে। attr_accessibleসাদা ব্যবহার করে সেই জিনিসগুলি তালিকাভুক্ত করা হয় যা ভর নির্ধারিত হতে পারে।


2
attr_accessibleরেল ডকুমেন্টেশনে নেই কেন ? api.rubyonrails.org
ক্লো

19
দেখে মনে হচ্ছে রেলস 4 এর কাছে নতুন জিনিস আছে। এই উত্তরটি দেখুন: স্ট্যাকওভারফ্লো.com
পল রুবেল

1
কারণ শক্ত প্যারামিটারটি attr_accessible এজগাইডস
ইমরান আহমদ

173

এই থ্রেড এবং গুগলে থাকা অনেক লোক খুব ভালভাবে ব্যাখ্যা করেছেন যা attr_accessibleএকটি অতিরিক্ত সময়ে হালনাগাদ করার অনুমতিপ্রাপ্ত বৈশিষ্ট্যের একটি শ্বেত তালিকাটি নির্দিষ্ট করে ( একই সাথে একই সাথে একটি বস্তুর মডেলের সমস্ত বৈশিষ্ট্য এক সাথে করা যায়) ) এটি আপনার অ্যাপ্লিকেশনটি সুরক্ষিত করার জন্য মূলত (এবং কেবল) "গণ নিয়োগ" থেকে জলদস্যু শোষণ করুন।

এটি এখানে অফিসিয়াল রেল ডক: ম্যাস অ্যাসাইনমেন্টে ব্যাখ্যা করা হয়েছে

attr_accessorএকটি ক্লাসে সেটার এবং গেটর পদ্ধতি তৈরি করার জন্য (দ্রুত) একটি রুবি কোড। এখানেই শেষ.

এখন, ব্যাখ্যা হিসাবে যা অনুপস্থিত তা হ'ল আপনি যখন কোনওভাবে কোনও ডাটাবেস টেবিলের সাথে একটি (রেল) মডেলটির মধ্যে একটি লিঙ্ক তৈরি করবেন তখন attr_accessorআপনার মডেলটিতে সেটার এবং গিটারগুলি কখনও তৈরি করতে হবে না যাতে আপনার সংশোধন করতে সক্ষম হন টেবিলের রেকর্ডস

এর কারণ আপনার মডেল ActiveRecord::Baseক্লাস থেকে সমস্ত পদ্ধতি উত্তরাধিকার সূত্রে প্রাপ্ত , যা ইতিমধ্যে আপনার জন্য প্রাথমিক CRUD অ্যাক্সেসরগুলি (তৈরি করুন, পড়ুন, আপডেট করুন, মুছুন) সংজ্ঞায়িত করে। এটি অফিল ডকটিতে এখানে রেলস মডেল এবং এখানে ওভাররাইটিং ডিফল্ট অ্যাক্সেসরের উপর ব্যাখ্যা করা হয়েছে ("ডিফল্ট অ্যাক্সেসর ওভাররাইট অধ্যায়" এ স্ক্রোল করুন)

উদাহরণস্বরূপ বলুন: আমাদের কাছে "ব্যবহারকারী" নামে একটি ডাটাবেস টেবিল রয়েছে যার মধ্যে তিনটি কলাম "প্রথম নাম", "শেষ নাম" এবং "ভূমিকা" রয়েছে:

এসকিউএল নির্দেশাবলী:

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

আমি ধরে নিয়েছি যে আপনি config.active_record.whitelist_attributes = trueআপনার অ্যাপ্লিকেশনটিকে গণ-কার্যবিবরণী শোষণ থেকে রক্ষা করতে আপনার কনফিগারেশন / পরিবেশ / উত্পাদনের জন্য বিকল্পটি সেট করেছেন । এটি এখানে ব্যাখ্যা করা হয়েছে: গণ নিয়োগ

আপনার রেলস মডেল নীচের মডেলটির সাথে নিখুঁতভাবে কাজ করবে:

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

আপনি attr_accessibleতালিকায় "ভূমিকা" বৈশিষ্ট্যগুলি যুক্ত করেন নি কারণ আপনি নিজের ব্যবহারকারীদের নিজেরাই তাদের ভূমিকা সেট করতে দিচ্ছেন না (অ্যাডমিনের মতো)। আপনি নিজেই এটি অন্য একটি বিশেষ অ্যাডমিন ভিউতে করেন।

যদিও আপনার ব্যবহারকারীর দৃষ্টিভঙ্গি "ভূমিকা" ক্ষেত্রটি প্রদর্শন করে না, একটি জলদস্যু সহজেই একটি HTTP পোষ্ট অনুরোধ প্রেরণ করতে পারে যার মধ্যে প্যারামের হ্যাশটিতে "ভূমিকা" অন্তর্ভুক্ত থাকে। এর অনুপস্থিত "ভূমিকা" বৈশিষ্ট্যটি attr_accessibleহ'ল আপনার অ্যাপ্লিকেশনটিকে সে থেকে রক্ষা করা।

আপনি এখনও নীচের মতো নিজের ইউজারআরোল অ্যাট্রিবিউট সংশোধন করতে পারেন তবে সমস্ত বৈশিষ্ট্য একসাথে নয়।

@user.role = DEFAULT_ROLE

তুমি কেন ব্যবহার করবে attr_accessor?

ঠিক আছে, এটির ক্ষেত্রে আপনার ব্যবহারকারী-ফর্মটি এমন একটি ক্ষেত্র দেখায় যা কলাম হিসাবে আপনার ব্যবহারকারীদের টেবিলে নেই।

উদাহরণস্বরূপ, বলুন যে আপনার ব্যবহারকারীর ভিউতে "আমি এখানে আছি-এ-অ্যাডমিন-দয়া করে বলুন" ফিল্ডটি দেখায়। আপনি এই তথ্যটি আপনার টেবিলে সংরক্ষণ করতে চান না। আপনি কেবল চান যে রেলস আপনাকে একটি ইমেল পাঠিয়ে সতর্ক করে দেয় যে একজন "পাগল" ;-) ব্যবহারকারী সাবস্ক্রাইব করেছেন।

এই তথ্যের ব্যবহার করতে সক্ষম হতে আপনাকে এটি অস্থায়ীভাবে অন্য কোথাও সংরক্ষণ করতে হবে। user.peekabooএট্রিবিউট এটিকে পুনরুদ্ধার করা এর চেয়ে সহজ আর কী ?

সুতরাং আপনি এই মডেলটি আপনার মডেলটিতে যুক্ত করুন:

class User < ActiveRecord::Base

  attr_accessible :firstname, :lastname
  attr_accessor :peekaboo

end

সুতরাং আপনি এটির একটি শিক্ষিত ব্যবহার করতে সক্ষম হবেন user.peekaboo আপনার নিয়ামকের যে কোনও জায়গায় কোনও ইমেল প্রেরণ করতে বা যা যা চান তা করতে ।

অ্যাক্টিভেকর্ড আপনার টেবিলের "পিকাবু" বৈশিষ্ট্যটি সংরক্ষণ করবে না যখন আপনি এটি করেন user.saveকারণ তিনি তার মডেলটিতে এই নামের সাথে কোনও কলামের সাথে মেলে না see


48

attr_accessorএকটি রুবি পদ্ধতি যা আপনাকে একই নামের একটি উদাহরণ ভেরিয়েবলের জন্য সেটার এবং গেটর পদ্ধতি দেয়। সুতরাং এটি সমতুল্য

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

attr_accessible একটি রেল পদ্ধতি যা ভর অ্যাসাইনমেন্টে কোন ভেরিয়েবল সেট করা যায় তা নির্ধারণ করে।

আপনি যখন কোনও ফর্ম জমা দিন, এবং আপনার মতো কিছু থাকে MyModel.new params[:my_model]তখন আপনি কিছুটা আরও নিয়ন্ত্রণ রাখতে চান, যাতে লোকেদের এমন জিনিস জমা দিতে না পারে যা আপনি চান না।

আপনি এটি করতে পারেন attr_accessible :emailযাতে যখন কেউ তাদের অ্যাকাউন্ট আপডেট করে, তারা তাদের ইমেল ঠিকানা পরিবর্তন করতে পারে। তবে আপনি তা করবেন না attr_accessible :email, :salaryকারণ কোনও ব্যক্তি ফর্ম জমা দেওয়ার মাধ্যমে তাদের বেতন নির্ধারণ করতে পারে। অন্য কথায়, তারা বাড়াতে তাদের উপায় হ্যাক করতে পারে।

এই জাতীয় তথ্য স্পষ্টভাবে পরিচালনা করা প্রয়োজন। ফর্ম থেকে কেবল এটি সরানোই যথেষ্ট নয়। কেউ ফায়ারব্যাগের সাথে যেতে পারেন এবং বেতন ক্ষেত্র জমা দেওয়ার জন্য ফর্মটিতে উপাদান যুক্ত করতে পারেন। কন্ট্রোলার আপডেট পদ্ধতিতে একটি নতুন বেতন জমা দেওয়ার জন্য তারা বিল্ট ইন কার্ল ব্যবহার করতে পারে, তারা কোনও স্ক্রিপ্ট তৈরি করতে পারে যা সেই তথ্য সহ একটি পোস্ট জমা দেয়।

সুতরাং attr_accessorদোকান ভেরিয়েবল পদ্ধতি তৈরি সম্পর্কে, এবং attr_accessibleভর বরাদ্দকরণ নিরাপত্তা সম্পর্কে।


2
আপনার একটি টাইপ আছে, কোড ব্লকের পরে এটি বলা উচিতattr_accesible
চুবাস

দুর্দান্ত লিখুন, আমি ক্লাসের উদাহরণটি পছন্দ করি। অতিরিক্ত (জাল) বোনাস পয়েন্টের ব্যাখ্যা সহ :as!
ইয়ান ভাগান

মডেলটি অ্যাক্টিভেকর্ড :: বেস দ্বারা প্রসারিত। class User < ActiveRecord::Base
সবুজ

18

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 উভয় প্রাপ্তকারী এবং সেটার পদ্ধতিতে অ্যাক্সেস সরবরাহ করে।

সুতরাং পরিবর্তিত কোড নীচের মত হয়

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

attr_accessibleআপনি ভর অ্যাসাইনমেন্টের অনুমতি দিতে চান এমন সমস্ত কলামগুলি তালিকাভুক্ত করার অনুমতি দেয়। এর বিপরীত attr_protectedযার অর্থ এই ক্ষেত্রটি আমি চাই না যে কাউকে ম্যাস এসাইনে অনুমতি দেওয়া হোক। সম্ভবত এটি আপনার ডাটাবেসে এমন একটি ক্ষেত্র হতে চলেছে যা আপনি চাইছেন না যে কেউ এদিক ওদিক বাঁদর করছে। একটি স্ট্যাটাস ফিল্ড বা মত।


2
সুতরাং আপনি কি বলছেন যে আমি যদি কোনও মাইগ্রেশনে ক্ষেত্র তৈরি করেছি, তবে এট্রে_অ্যাক্সেসযোগ্য ব্যবহার করে এগুলি উপলব্ধ করুন, গেটর এবং সেটার তৈরি করার দরকার নেই? ক্ষেত্রটি যদি ডাটাবেসে না থাকে, তবে কীভাবে আসুন_অ্যাক্সেসযোগ্য একটি গেটর / সেটারের মতো কাজ করবেন না? যদি আমি একটি লাইন "has_secure_password" অন্তর্ভুক্ত করি তবে গ্রাহক / সেটটার: পাসওয়ার্ড এবং: পাসওয়ার্ড_ কনফার্মেশনটি ডাটাবেসে না থাকলেও অ্যাটর_এক্সেসিবল যথেষ্ট হয়ে যায়। খুব বিভ্রান্ত;)
দশম

2

দুটি কথায়:

attr_accessorহয় getter, setterপদ্ধতি। তবে attr_accessibleএটি বলতে হবে যে নির্দিষ্ট বৈশিষ্ট্যটি অ্যাক্সেসযোগ্য বা না। এটাই.


আমি যোগ করতে চাই আমাদের বড় অ্যাসাইনমেন্ট থেকে রক্ষা না করে স্ট্রং প্যারামিটার ব্যবহার করা উচিত attr_accessible

চিয়ার্স!


2

একটি দ্রুত এবং সংক্ষিপ্ত পার্থক্য ওভারভিউ:

attr_accessorআপনার ক্লাসে পঠন এবং লেখার জন্য লেখক তৈরি করার একটি সহজ উপায়। আপনার ডাটাবেসে কোনও কলাম না থাকলে এটি ব্যবহৃত হয়, তবে এখনও আপনার ফর্মগুলিতে একটি ক্ষেত্র দেখাতে চান। এই ক্ষেত্রটি “virtual attribute”একটি রেলস মডেল।

ভার্চুয়াল অ্যাট্রিবিউট - ডাটাবেসের কোনও কলামের সাথে সম্পর্কিত নয় এমন একটি বৈশিষ্ট্য।

attr_accessible আপনার নিয়ামক পদ্ধতি দ্বারা অ্যাক্সেসযোগ্য এমন বৈশিষ্ট্যগুলি চিহ্নিত করতে ব্যবহৃত হয় একটি ভর-কার্যভারের জন্য একটি সম্পত্তি উপলব্ধ করে .. এটি কেবলমাত্র আপনার নির্দিষ্ট করা বৈশিষ্ট্যগুলিতে অ্যাক্সেসের অনুমতি দেবে, বাকিগুলি অস্বীকার করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.