4.1 রেলের মধ্যে নির্বাচন থেকে এনাম সংরক্ষণ করা


108

আমি মদ রঙের ট্র্যাক রাখতে ums.১ রেলগুলিতে এনাম ব্যবহার করছি।

Wine.rb

class Wine < ActiveRecord::Base
    enum color: [:red, :white, :sparkling]
end

আমার দৃষ্টিতে, আমি একটি নির্বাচন উত্পন্ন করি যাতে ব্যবহারকারী নির্দিষ্ট রঙের সাথে একটি ওয়াইন নির্বাচন করতে পারে

f.input :color, :as => :select, :collection => Wine.colors

এটি নিম্নলিখিত HTML তৈরি করে:

<select id="wine_color" name="wine[color]">
  <option value=""></option>
  <option value="0">red</option>
  <option value="1">white</option>
  <option value="2">sparkling</option>
</select>

তবে, ফর্মটি জমা দেওয়ার পরে, আমি উল্লেখ করে একটি যুক্তি ত্রুটি পেয়েছি '1' is not a valid color। আমি বুঝতে পারছি এটি কারণ colorসমান 1এবং না "1"

রেলগুলি স্ট্রিংয়ের পরিবর্তে পূর্ণসংখ্যা হিসাবে রঙটি ব্যাখ্যা করতে বাধ্য করার কোনও উপায় আছে?

উত্তর:


203

ঠিক আছে, সুতরাং স্পষ্টতই, আপনি এনামের পূর্ণসংখ্যা মানটি সংরক্ষণ করা উচিত নয়। আপনার এনামের পাঠ্য মানটি পাঠানো উচিত।

আমি ইনপুটটিকে নিম্নলিখিত হিসাবে পরিবর্তন করেছি:

f.input :color, :as => :select, :collection => Wine.colors.keys.to_a

যা নিম্নলিখিত HTML তৈরি করে:

<select id="wine_color" name="wine[color]">
  <option value=""></option>
  <option value="red">red</option>
  <option value="white">white</option>
  <option value="sparkling">sparkling</option>
</select>

মানগুলি "0" থেকে "লাল" এ চলে গেছে এবং এখন আমরা সবাই সেট হয়ে গেছি।


আপনি যদি নিয়মিত ওল রেল ব্যবহার করে থাকেন তবে এটি পাঠ্যক্ষেত্র:

f.select :color, Wine.colors.keys.to_a


আপনি যদি বিশুদ্ধ মানব-পঠনযোগ্য গুণাবলী রাখতে চান তবে আপনি এটি করতে পারেন:

f.select :color, Wine.colors.keys.map { |w| [w.humanize, w] }


8
FWIW, আমার এটি তৈরি করা দরকার f.select :color, Wine.colors.to_a.map { |w| [w[0].humanize, w[0]] }কারণ wএকটি অ্যারের প্রতিনিধিত্ব করা হয়েছিল represented কেন নিশ্চিত নয়, তবে সম্ভবত এটি কাউকে সহায়তা করবে।
জেকালবোগ

titleizeআপনার দুটি বা ততোধিক শব্দ থাকলে ব্যবহার করা আরও ভাল ধারণা হতে পারে
আনোয়ার

8
keysপদ্ধতি একটি বিন্যাস দেখায় তাই to_aঅপ্রয়োজনীয়। বিকল্পভাবে নির্বাচনের সাহায্যকারী পদ্ধতিটি বিকল্পগুলির জন্য 2 ডি অ্যারে নেয় যাতে আপনি কেবল ব্যবহার করতে পারেন to_a
এক্সান্ডার-মিলার

যদি কোনও "অবৈধ স্ট্রিং যেমন" ERROR_JUNK_Submission "প্রেরণ করা হয় তবে কী হবে। স্পষ্টতই এর মতো কোনও এনাম মান নেই এবং একটি ব্যতিক্রম ছুঁড়ে দেওয়া হয়েছে। আমরা এটা কোথায় ধরব?
ফ্ল্যাভিভিভি

মডেল মদ একটি enum রঙ বলা enum color: [:red, :white, :sparkling]যাতে সঠিক বাক্যf.input :color, :as => :select, :collection => Wine.color.keys.to_a
hguzman

32

এনাম হ্যাশকে অ্যারেতে রূপান্তর করার দরকার নেই to_a। এই যথেষ্ট:

f.select :color, Wine.colors.map { |key, value| [key.humanize, key] }

10

আমি কেবল একটি এনামহেল্পার একসাথে রেখেছি যা আমি ভেবেছিলাম যে আমি আপনার এনাম নির্বাচনের জন্য আরও কাস্টমাইজড এনাম লেবেল এবং লোকেলগুলির প্রয়োজন তাদের সহায়তা করতে ভাগ করব।

module EnumHelper

  def options_for_enum(object, enum)
    options = enums_to_translated_options_array(object.class.name, enum.to_s)
    options_for_select(options, object.send(enum))
  end

  def enums_to_translated_options_array(klass, enum)
    klass.classify.safe_constantize.send(enum.pluralize).map {
        |key, value| [I18n.t("activerecord.enums.#{klass.underscore}.#{enum}.#{key}"), key]
    }
  end

end

আপনার লোকালে:

 en:
   activerecord:
     enums:
      wine:
        color:
          red:   "Red Wine"
          white:  "White Wine"

আপনার মতামত:

 <%= f.select(:color, options_for_enum(@wine, :color)) %>

1
সম্পাদনাটি অনুবাদ কীগুলি আরও পাঠ্যযোগ্য করে তোলে মাল্টিপল ওয়ার্ডক্লাসনামের অন্তর্গত এনামগুলি একাধিক মূলক্ল্যাড_ক্লাস_নামটির পরিবর্তে একাধিক
মূলক্ল্যাশনের নাম অনুসারে

গ্রেফিস ফ্যালব্যাকের জন্য একটি ডিফল্টে যুক্ত করার বিষয়ে কীভাবে: [I18n.t("activerecord.enums.#{klass.underscore}.#{enum}.#{key}", default: key.humanize), key] শেষটি সরিয়ে ফেলুন কারণ humanizeএটির একাধিক শব্দ যদি বড় হয়ে যায় তবে এটি মূলধনকে বিকৃত করতে পারে
পিটার পি।

9

গৃহীত সমাধানটি মানব পাঠযোগ্য হিসাবে আমার পক্ষে কাজ করে না , তবে আমি এটিকে এটির মতো কাজ করতে সক্ষম করেছিলাম:

<%= f.select(:color, Wine.colors.keys.map {|key| [key.humanize, key]}) %>

এটি ছিল সবচেয়ে পরিষ্কার, তবে আমার চাবিগুলি মানবিক করার দরকার ছিল:

<%= f.select(:color, Wine.colors.keys) %>


@ ভি-শাই, এই উপায় কী, আপনি ব্যাখ্যা করতে পারেন?
ইসমাইলালিক

2
@ ইসমাইলিলিক, নির্বাচিত বিকল্প হিসাবে সরাসরি কীগুলি সরবরাহ করুন, <% = f.select (: রঙ, Wine.colors.keys)%>
SHY

6

আপনি যদি রেল 4 এ এনাম ব্যবহার করেন তবে কেবল কল করুন Model.enums:

f.select :color, Wine.colors.keys

এইচটিএমএল তৈরি করতে:

<select name="f[color]" id="f_color">
    <option value="red">red</option>
    <option value="white">white</option>
    <option value="sparkling"> sparkling </option>
</select>

বা নিয়ামকটিতে পদ্ধতি যুক্ত করুন:

def update_or_create
    change_enum_to_i
    ....
end

def change_enum_to_i
    params[:f]["color"] = params[:f]["color"].to_i
end

4

এখানে আমার জন্য যা কাজ করেছে তা হল, 4+ রেলগুলি:

class Contract < ApplicationRecord

enum status: { active:  "active", 
               ended: "active", 
               on_hold: "on_hold", 
               terminated:  "terminated", 
               under_review:  "under_review" , 
               unknown: "unknown" 
              }


end

ইন my _form.html.erb, আমি এই আছে:

  <div class="field">
    <%= form.select :status, Contract.statuses.keys, {}%>
  </div>

একটি রেকর্ড যুক্ত করার পরে কনসোল থেকে পরীক্ষা:

2.3.0 :001 > Contract.last.status
  Contract Load (0.2ms)  SELECT  "contracts".* FROM "contracts" ORDER BY "contracts"."id" DESC LIMIT ?  [["LIMIT", 1]]
 => "active"

3

আপনার যদি এনাম কীগুলি ব্যবহার করতে পারেন তার উপর ভিত্তি করে আপনার আই 18n হ্যান্ডেল করতে হয়:

<%= f.select :color, Wine.colors.keys.map {|key| [t("wine.#{key}"), key]} %>

এবং ট্রানলেশনে আপনি রঙ সেট করতে পারেন:

wine:
 red: Red
 white: White

1

এখানে আমার সমাধান (আমার ভূমিকাগুলিতে "বিক্রয়_rep" এর মতো আন্ডারস্কোর রয়েছে) এবং কোনও কারণে এটি আমাকে কাজ করার জন্য একটি ফাঁকা বিকল্প (সরলফর্মের সাথে?) পাওয়ার দরকার ছিল:

অ্যাপ্লিকেশনহেল্পারে:

def enum_collection_for_select(attribute, include_blank = true)
  x = attribute.map { |r| [r[0].titleize, r[0]] }
  x.insert(0,['', '']) if include_blank == true
  x
end

তারপরে আমার ফর্মটিতে:

<%= f.input :role, collection: enum_collection_for_select(User.roles), selected: @user.role %>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.