অ্যাক্টিভমডেল :: নতুন ব্যবহারকারী তৈরি করার সময় নিষিদ্ধঅ্যাট্রিবিউটস এরর


223

আমার এই মডেলটি রুবিতে রয়েছে তবে এটি একটি ছুঁড়ে দেয় ActiveModel::ForbiddenAttributesError

class User < ActiveRecord::Base
  attr_accessor :password
  validates :username, :presence => true, :uniqueness => true, :length => {:in => 3..20}
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, :uniqueness => true, format: { with: VALID_EMAIL_REGEX }

  validates :password, :confirmation => true
  validates_length_of :password, :in => 6..20, :on => :create

  before_save :encrypt_password
  after_save :clear_password

  def encrypt_password
    if password.present?
      self.salt = BCrypt::Engine.generate_salt
      self.encrypted_password= BCrypt::Engine.hash_secret(password, salt)
    end
  end

  def clear_password
    self.password = nil
  end
end

যখন আমি এই ক্রিয়াটি চালাই

  def create
    @user = User.new(params[:user])
    if @user.save
      flash[:notice] = "You Signed up successfully"
      flash[:color]= "valid"
    else
      flash[:notice] = "Form is invalid"
      flash[:color]= "invalid"
    end
    render "new"
  end

উপর ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]

আপনি কি দয়া করে আমাকে বলতে পারেন কীভাবে এই ত্রুটি থেকে মুক্তি পাবেন বা একটি সঠিক ব্যবহারকারী নিবন্ধকরণ ফর্ম স্থাপন করবেন?


2
অ্যাট্রি_ অ্যাক্সেসেবল: পাসওয়ার্ড,: পাসওয়ার্ড_ কনফার্মেশন,: ব্যবহারকারীর নাম, ইমেল, ইমেল:: আপনার অন্যান্য বৈশিষ্ট্যগুলি ব্যবহার করে মডেল
বাচন স্মৃতি

1
যোগ strong_parameter ব্যবহারের মণি attr_accessible
ওয়েবেনিং লি

অ্যাটর_অ্যাক্সেসযোগ্য ব্যবহারের জন্য শক্তিশালী পরামিতি ?!
থিম এনগুইন

1
আমি বিশ্বাস করি @ ব্রুসিলি এর অর্থ: protected_attributesব্যবহারের জন্য রত্ন যুক্ত করুন attr_accessible
স্টিফান ম্যাগনসন

উত্তর:


398

আমি ধারণা করি আপনি 4 টি রেল ব্যবহার করছেন। যদি তাই হয় তবে প্রয়োজনীয় প্যারামিটারগুলি অবশ্যই প্রয়োজনীয় হিসাবে চিহ্নিত করতে হবে।

আপনি এটি এটি করতে চাইবেন:

class UsersController < ApplicationController

  def create
    @user = User.new(user_params)
    # ...
  end

  private

  def user_params
    params.require(:user).permit(:username, :email, :password, :salt, :encrypted_password)
  end
end

2
এটি কেন কাজ করে বা কেন এটি প্রয়োজন তা নিয়ে কোনও দলিল আছে?
DiverseAndRemote.com

20
@ ওমারজ্যাকম্যান কার্যকারিতাটি strong_parameterরত্ন দ্বারা সরবরাহ করা হয়েছে । এটি কারাগারের গাইডগুলিতে আচ্ছাদিত রয়েছে: guides.rubyonrails.org/…
ডোমন

21
লোকেরা রেল 4.0 এর সাথে কানক্যান ব্যবহার করলে তারা এটির অভিজ্ঞতা অর্জন করতে পারে । কানক্যান আপডেট না হওয়া অবধি অ্যান্টনট্রেপসের পরিবর্তে পরিষ্কার কাজের সমাধান চেষ্টা করুন solution
mjnissim

@mjnissim আপনি কি দয়া করে এটি আলাদা উত্তর হিসাবে পোস্ট করবেন? আমি এটি প্রথমবারের মধ্য দিয়ে মিস করেছি, তবে এটি এখনও আমাকে অনেকটা সময় বাঁচিয়েছে।
পল পেটেনগিল

64

ক্যানক্যান ব্যবহারকারীদের জন্য । লোকেরা যদি এটি রেল 4+ এর সাথে ক্যানক্যান ব্যবহার করে তবে এটির অভিজ্ঞতা হতে পারে । ক্যানক্যান আপডেট না হওয়া পর্যন্ত এখানে অ্যান্টন ট্র্যাপসের পরিবর্তে পরিষ্কার কাজের সমাধান চেষ্টা করুন :

ইন ApplicationController:

before_filter do
  resource = controller_name.singularize.to_sym
  method = "#{resource}_params"
  params[resource] &&= send(method) if respond_to?(method, true)
end

এবং রিসোর্স কন্ট্রোলারে (উদাহরণস্বরূপ নোটকন্ট্রোলার):

private
def note_params
  params.require(:note).permit(:what, :ever)
end

হালনাগাদ:

ক্যানক্যান নামে পরিচিত কানক্যানের জন্য এখানে একটি ধারাবাহিকতা প্রকল্প রয়েছে যা আশাব্যঞ্জক বলে মনে হচ্ছে:

CanCanCan


1
ধন্যবাদ !! আমার একটি প্রশ্ন রয়েছে, ক্যানক্যানক্যান (সক্রিয়) সহ সমাধান করা হয়েছে বা এই কোডটির প্রয়োজন নেই?
অ্যাড্রিয়ানো রিসেন্ডে

আমার জন্য, ক্যানক্যান কেন এখনও বিষয়টি আছে। ব্যবহার load_resourceবা ব্যবহার না করে load_resource :except => :createসমস্যার সমাধান হয়েছে। এখানে
টুন

24

শক্তিশালী পরামিতিগুলি এড়াতে এখানে সহজ উপায় রয়েছে, আপনাকে কেবল পরামিতিগুলিকে একটি নিয়মিত হ্যাশে রূপান্তর করতে হবে, যেমন:

unlocked_params = ActiveSupport::HashWithIndifferentAccess.new(params)

model.create!(unlocked_params)

এটি অবশ্যই শক্তিশালী পরামিতিগুলির উদ্দেশ্যকে পরাভূত করে, তবে আপনি যদি আমার মতো পরিস্থিতিতে থাকেন (আমি আমার সিস্টেমের অন্য অংশে অনুমোদিত প্যারামগুলির নিজস্ব পরিচালনা করছি) এটি কাজটি সেরে ফেলবে।


6 রেলের মধ্যে কাজ করে না, ব্যতিক্রম:unable to convert unpermitted parameters to hash
টাইলার

20

অ্যাক্টিভএডমিন ব্যবহার করে ভুলে যাবেন না যে মডেল রেজিস্টার ব্লকে একটি অনুমতিপত্র_প্যারাম রয়েছে:

ActiveAdmin.register Api::V1::Person do
  permit_params :name, :address, :etc
end

এগুলি নিয়ন্ত্রণকারীদের সাথে সেট করা দরকার:

def api_v1_person_params
  params.require(:api_v1_person).permit(:name, :address, :etc)
end

অন্যথায় আপনি ত্রুটি পাবেন:

ActiveModel::ForbiddenAttributesError

18

ক্যানক্যানক্যান ব্যবহারকারীদের জন্য :

CanCanCan সঠিক প্যারাম পদ্ধতিটি না খুঁজে পেতে পারলে আপনি এই ত্রুটিটি পাবেন ।

জন্য :createকর্ম, ফরাসী নৃত্যবিশেষ দেখে sanitized ইনপুট দিয়ে একটি নতুন দৃষ্টান্ত আরম্ভ করতে যদি আপনার নিয়ামক (অনুক্রমে) নিম্নলিখিত পদ্ধতিগুলির সাড়া দেবেন চেষ্টা করবে:

  1. create_params
  2. <model_name>_params যেমন নিবন্ধ_প্রেমস (এটি আপনার পরম পদ্ধতির নামকরণের জন্য রেলগুলিতে ডিফল্ট কনভেনশন)
  3. resource_params (একটি সাধারণভাবে নামকরণ পদ্ধতি যা আপনি প্রতিটি নিয়ামককে নির্দিষ্ট করতে পারেন)

অতিরিক্তভাবে, load_and_authorize_resourceএখন param_methodইনপুট স্যানিটাইজ করতে চালানোর জন্য নিয়ামকটিতে একটি কাস্টম পদ্ধতি নির্দিষ্ট করার বিকল্প নিতে পারে।

param_methodবিকল্পটি এমন একটি পদ্ধতির নামের সাথে প্রতীকের সাথে সংযুক্ত করতে পারেন যা কল হবে:

class ArticlesController < ApplicationController
  load_and_authorize_resource param_method: :my_sanitizer

  def create
    if @article.save
      # hurray
    else
      render :new
    end
  end

  private

  def my_sanitizer
    params.require(:article).permit(:name)
  end
end

উত্স: https://github.com/CanCanCommune/cancancan#33- স্ট্রং-পরিমিতি


3

বিকল্পভাবে আপনি সুরক্ষিত বৈশিষ্ট্য রত্ন ব্যবহার করতে পারেন , তবে এটি শক্তিশালী প্যারামগুলির প্রয়োজনের উদ্দেশ্যে হেরে যায়। তবে আপনি যদি কোনও পুরানো অ্যাপ্লিকেশন আপগ্রেড করছেন তবে সুরক্ষিত বৈশিষ্ট্যগুলি আপগ্রেড করার একটি সহজ পথ প্রদান করে না যতক্ষণ না আপনি শক্তিশালী প্যারামগুলিতে অ্যাটর্স_অ্যাক্সেসযোগ্য রিফ্যাক্টর করতে পারেন।


0

আপনি যদি রেল 4 এ থাকেন এবং আপনি এই ত্রুটিটি পান তবে আপনি enumযদি মডেলটি ব্যবহার করেন যদি আপনি এই জাতীয় চিহ্নগুলি দিয়ে সংজ্ঞা দিয়ে থাকেন:

class User
  enum preferred_phone: [:home_phone, :mobile_phone, :work_phone]
end

ফর্মটি স্ট্রিং প্যারাম হিসাবে একটি রেডিও নির্বাচক বলবে pass আমার ক্ষেত্রে এটিই ঘটেছিল। সহজ ফিক্সটি হল enumপ্রতীকগুলির পরিবর্তে স্ট্রিংগুলিতে পরিবর্তন করা

enum preferred_phone: %w[home_phone mobile_phone work_phone]
# or more verbose
enum preferred_phone: ['home_phone', 'mobile_phone', 'work_phone']
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.