ruby on rails - Attr_accessor এবং attr_accessible মধ্যে পার্থক্য




ruby-on-rails (4)

দুইটি শব্দে:

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

আমি ভর অ্যাসাইনমেন্ট থেকে রক্ষা করার জন্য attr_accessible পরিবর্তে আমাদের দৃঢ় পরামিতি ব্যবহার করতে চাই।

চিয়ার্স!

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

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


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

এখানে সরকারী Rails ডক: Mass Assignment এ ব্যাখ্যা করা হয়

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

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

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

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

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

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

আমি অনুমান করেছি যে আপনি আপনার অ্যাসাইনমেন্ট ভর ব্যবহার থেকে আপনার অ্যাপ্লিকেশনটি সুরক্ষিত করতে config.active_record.whitelist_attributes = true আপনার কনফিগারেশন / পরিবেশ / production.rb বিকল্পটি সেট করুন। এই এখানে ব্যাখ্যা করা হয়: ভর নিয়োগ

আপনার Rails মডেলটি নিচের মডেলের সাথে পুরোপুরি কাজ করবে:

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 তালিকাতে "ভূমিকা" গুণাবলীগুলি যোগ করেননি কারণ আপনি নিজের ব্যবহারকারীদের নিজের ভূমিকাটি নিজের দ্বারা নির্ধারণ করতে 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 এর একটি শিক্ষিত ব্যবহার করতে সক্ষম হবেন যাতে আপনি ইমেল পাঠাতে বা যা চান তা করতে পারেন।

ActiveRecord যখন আপনি user.save করবেন তখন আপনার টেবিলে "peekaboo" বৈশিষ্ট্য সংরক্ষণ করবেন না কারণ তার মডেলটিতে এই নামের সাথে মেলে এমন কোনো কলাম দেখছেন না।


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

এখানে একটি ভর নিয়োগ করা হয়:

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

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

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

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


attr_accessor রুবি কোড এবং আপনার ডেটাবেসে কলাম না থাকলে এটি ব্যবহার করা হয় তবে এখনও আপনার ফর্মগুলিতে একটি ক্ষেত্র দেখাতে চান। এটি অনুমোদন করার একমাত্র উপায় attr_accessor :fieldname ক্ষেত্রের নাম এবং যদি আপনি চান তবে আপনার দৃশ্য, বা মডেলের ক্ষেত্রে এই ক্ষেত্রটি ব্যবহার করতে পারেন, তবে বেশিরভাগ আপনার ভিউতে।

আসুন নিম্নলিখিত উদাহরণ বিবেচনা করা যাক

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

এখানে আমরা অ্যাক্সেস করার জন্য attr_writer ( attr_writer গুণাবলী ) এবং attr_writer ( attr_writer ) ব্যবহার করেছি। কিন্তু আমরা attr_accessor ব্যবহার করে একই কার্যকারিতা অর্জন করতে পারেন। সংক্ষেপে, attr_accessor উভয় getter এবং setter পদ্ধতি অ্যাক্সেস উপলব্ধ করা হয়।

তাই সংশোধিত কোড নিচে হিসাবে

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

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





ruby