মডেলটিতে দেখার চেয়ে "নম্বর_ টু_কুরান্সি" সহায়তা পদ্ধতিটি কীভাবে ব্যবহার করবেন?


94

আমি to_dollarআমার মডেলটিতে এই জাতীয় পদ্ধতি ব্যবহার করতে চাই :

module JobsHelper      
  def to_dollar(amount)
    if amount < 0
      number_to_currency(amount.abs, :precision => 0, :format => "-%u%n")
    else
      number_to_currency(amount, :precision => 0)
    end
  end      
end

class Job < ActiveRecord::Base
  include JobsHelper
  def details
    return "Only " + to_dollar(part_amount_received) + 
           " out of " + to_dollar(price) + " received."
  end
end

দুর্ভাগ্যক্রমে, number_to_currencyপদ্ধতিটি এখানে স্বীকৃত নয়:

# <কাজ: 0x311eb00> এর জন্য অপরিজ্ঞাত পদ্ধতি `সংখ্যা_ থেকে_কুরিঞ্জি '

কোনও ধারণা কীভাবে এটি কাজ করবে?

উত্তর:


103

এটি উপলভ্য নয় কারণ এটি কোনও মডেল (সাধারণত) এর ব্যবহার এমভিসি লঙ্ঘন করে (এবং এটি আপনার ক্ষেত্রে মনে হয়)। আপনি ডেটা নিচ্ছেন এবং উপস্থাপনের জন্য এটি হেরফের করছেন। এটি, সংজ্ঞা অনুসারে, দৃষ্টিভঙ্গির সাথে সম্পর্কিত, মডেলটির নয়।

এখানে কিছু সমাধান রয়েছে:

  • মডেল এবং দর্শনের মধ্যস্থতা করতে উপস্থাপক বা দর্শন মডেল অবজেক্টটি ব্যবহার করুন। এটি প্রায় অন্যান্য সমাধানের তুলনায় প্রায় প্রাথমিক কাজ প্রয়োজন তবে এটি প্রায়শই একটি ভাল নকশা। উপস্থাপক / দর্শন-মডেলটিতে সহায়তাকারীরা এমভিসি লঙ্ঘন করে না, কারণ তারা দৃশ্যের স্তরটিতে বসবাস করে, traditionalতিহ্যবাহী কাস্টম রেল সহায়ক এবং যুক্তি-পূর্ণ ভিউগুলি প্রতিস্থাপন করে।

  • স্পষ্টভাবে include ActionView::Helpers::NumberHelperমধ্যে JobsHelperপাগল নেভিগেশন নির্ভর করে এর পরিবর্তে জাদুর এটা আপনার জন্য লোড করে। এটি এখনও দুর্দান্ত নয়, কারণ আপনার কোনও মডেল থেকে কোনও সহায়ককে অ্যাক্সেস করা উচিত নয়।

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

আপনি যদি মনে করেন "তবে আমার মডেলটিতে আমার to_csv& to_pdfপদ্ধতিগুলি লেখার জন্য সত্যই আমার এটি প্রয়োজন !", তবে আপনার পুরো ভিত্তিটি ভুল all সর্বোপরি, আপনার কোনও to_htmlপদ্ধতি নেই, তাই না? এবং এখনও আপনার অবজেক্টটি প্রায়শই এইচটিএমএল হিসাবে রেন্ডার হয়। আপনার ডেটা মডেলটি সিএসভি কী তা জানার পরিবর্তে আপনার আউটপুট উত্পন্ন করার জন্য একটি নতুন শ্রেণি তৈরি করার কথা বিবেচনা করুন ( কারণ এটি হওয়া উচিত নয় )।

মডেল ActiveModel বৈধতা ত্রুটির জন্য সাহায্যকারী ব্যবহার হিসাবে, ভাল, আমি দুঃখিত কিন্তু ActiveModel / পাগল আমাদের সবাইকে সেখানে ত্রুটি বার্তা অত্যাচার তথ্য স্তরে উপলব্ধি করা প্রয়োজন, বরং তুলনায় শব্দার্থিক ফিরে মাতাল হয়েছে ধারণা একটি ত্রুটির হতে পরে বুঝতে পারলাম — দীর্ঘশ্বাস । আপনি এটি কাছাকাছি পেতে পারেন, তবে এর অর্থ মূলত অ্যাক্টিভমডেল :: ত্রুটিগুলি আর ব্যবহার করা নয়। আমি এটা করেছি, এটা ভাল কাজ করে।

অন্যদিকে, এর পদ্ধতিগুলির সেটটিকে দূষিত না করে উপস্থাপক / ভিউ-মডেলটিতে সহায়তাকারীদের অন্তর্ভুক্ত করার একটি দরকারী উপায় (কারণ উদাহরণস্বরূপ করতে সক্ষম হওয়া MyPresenterOrViewModel.new.link_to(...)কোনও মানে হয় না):

class MyPresenterOrViewModel
  def some_field
    helper.number_to_currency(amount, :precision => 0)
  end

  private

  def helper
    @helper ||= Class.new do
      include ActionView::Helpers::NumberHelper
    end.new
  end
end

4
আমি সাধারণত এই নিয়মটি অনুসরণ করি তবে মডেলটিতে সংজ্ঞায়িত বৈধতা ত্রুটি বার্তাটি ফর্ম্যাট করতে যখন ভিউ সহায়কের দরকার হয় তখন এটি ভেঙে ফেলি।
ফ্লোরেন্ট

44
এটি ভাল পরামর্শ, তবে এটি একটি খারাপ উত্তর কারণ এটি প্রশ্নের সমাধান করে না।
জেরেল

21
এমন কেস রয়েছে যেখানে এটি দুর্দান্ত উত্তর নয়, উদাহরণস্বরূপ এখনই যেখানে আমি সিএসভি প্রতিবেদনটি কিনছি এবং ক্লাসে টু_সিএসভি পদ্ধতিতে এর মতো কিছু ব্যবহার করা দরকার যা কোনও দৃশ্য কখনও দেখতে পাবে না। প্রোগ্রামিং আদর্শগুলিকে কেবল অঙ্কিত করা সবসময় সহায়ক নয়।
নাইটকোডার

4
হ্যাঁ, নাইটকোডার কী বলেছে। আমি একই ইস্যুতে চলছে। আমি পিডিএফ রিপোর্ট তৈরি করছি এবং কেবল একটি ফোন নম্বর সুন্দরভাবে ফর্ম্যাট করতে চাই।
জেমস অ্যাডাম

4
@ মরিস এটি একটি পিচ্ছিল opeাল "ভাল কেবল এই এক জিনিস" থেকে একটি স্ফীত মডেলের দিকে। রেলগুলিতে অ্যাপ হেল্পাররা একটি জাঙ্ক-ড্রয়ার, উপস্থাপক / দর্শন মডেলগুলি পরিচালনা করা সহজ। আমি তৈরি দেখছি না ডেটা (ইত্যাদি | পিডিএফ | | CSV। HTML) একটি প্রতিবেদনের জন্য এবং উৎপাদিত দৃশ্য কোন বেশি আমি যেমন, একটি ব্যক্তি এবং একটি HTML ব্যক্তি প্রদর্শনী পৃষ্ঠার জন্য কি করতে একটি একক দায়িত্ব হিসাবে তথ্য।
অ্যান্ড্রু মার্শাল

184

আমি আপনাদের সবার সাথে একমত যে এটি এমভিসি প্যাটার্নটি ভেঙে ফেলতে পারে তবে প্যাটার্নটি ভাঙ্গার কারণগুলি সবসময় থাকতে পারে, আমার ক্ষেত্রে এই টাকার টেমপ্লেট ফিল্টারটিতে আমার মুদ্রার বিন্যাস পদ্ধতি ব্যবহার করার প্রয়োজন ছিল ( আমার ক্ষেত্রে তরল )।

শেষে আমি জানতে পেরেছিলাম যে আমি এই জাতীয় জিনিসগুলি ব্যবহার করে এই মুদ্রা বিন্যাস পদ্ধতিতে অ্যাক্সেস করতে পারি :

ActionController::Base.helpers.number_to_currency

6
এটি করার কিছুটা পরিষ্কার উপায় থাকলেও এটি ভাল। দেখুন http://railscasts.com/episodes/132-helpers-outside-views
user664833

4
ইয়ে কমেন্টস ট্র্যাকস রেইলকাস্টস: 2013-এ রেল 3 এ, একটি নিয়ন্ত্রণকারীর মধ্যে একটি ভিউ হেল্পার ব্যবহার করা হয়েছে ভিউ_কন্টেক্সট.নম্বার_ট_ক্রেন্সি (পরিমাণ)
leleolleolle

4
আপনি "অর্থ" রত্ন ব্যবহার সম্পর্কে চিন্তাভাবনা করেছেন? মানি অবজেক্ট যেমন একটি ফর্ম্যাট () পদ্ধতি সরবরাহ করে এবং আপনি এটি মডেল, নিয়ামক বা দর্শনে প্রার্থনা করতে পারেন।
জ্যাক শো

74

আমি জানি যে এই থ্রেডটি খুব পুরানো, তবে কেউ এই সমস্যার সমাধানের জন্য রেজিল 4+ এ সন্ধান করতে পারে। ডেভেলপাররা অ্যাক্টিভসপোর্ট :: নাম্বার হেল্পার যুক্ত করেছে, যা ব্যবহার করে সম্পর্কিত মডিউল / ক্লাস ব্যবহার না করেই ব্যবহার করা যেতে পারে:

ActiveSupport::NumberHelper.number_to_currency(amount, precision: 0)

এই পদ্ধতিটি আমার পক্ষে কাজ করেছিল যখন আমি number_to_percentageরেলস কনসোলের আচরণের সাথে পরীক্ষা করতে চাই । ধন্যবাদ!
জন স্নাইডার

28

আপনাকে অ্যাকশনভিউ :: সহায়কগুলি :: সংখ্যাহেল্পারও অন্তর্ভুক্ত করতে হবে

class Job < ActiveRecord::Base
  include ActionView::Helpers::NumberHelper
  include JobsHelper
  def details
    return "Only " + to_dollar(part_amount_received) + 
           " out of " + to_dollar(price) + " received."
  end
end

4
ধন্যবাদ, দেখতে ভাল লাগছে, তবে অন্যদের সাথে আমারও একমত হতে হবে যা বলে যে আমি এমভিসি লঙ্ঘন করেছি। আমি detailsসাহায্যকারী রাখব ।
মিশা মোরোশকো

4
আপনি যদি ফ্লোরেন্ট 2 এর মতো হন এবং এটি একটি বৈধতা বার্তার অংশ হিসাবে রাখা দরকার তবে সহায়ক। ধন্যবাদ স্যাম
রায়ানজেএম

এটি আমার পক্ষে কাজ করেছে। আমি মনে করি না যে সর্বদা এমভিসি (বা কোনও নীতি) অনুসরণ করা কোনও অর্থবোধ করে না যদি সেই নীতি লঙ্ঘন করে এমন কোনও সমাধান মেনে চলা তার চেয়ে পরিষ্কারভাবে ভাল হয়।
জেসন সোয়েট

4
এই পদ্ধতির সুপারিশ করা হয় না। এটি আপনার প্রয়োজনীয় না এমন প্রচুর পদ্ধতি যুক্ত করে এবং এটি আপনার নাম স্থানটি বিশৃঙ্খল করে তোলে, এটি কিছু পদ্ধতি ওভাররাইট করতে পারে এবং কিছু সহায়ক মডিউলগুলি অন্যান্য সহায়ক মডিউলগুলিতে নির্ভর করে (যাতে আপনার একাধিক মডিউল অন্তর্ভুক্ত করতে হতে পারে), যার ফলে সমস্যাটি তৈরি হয় making আরো খারাপ. ব্যাখ্যা এবং আরও ভাল পদ্ধতির জন্য দেখুন: http://railscast.com/episodes/132-helpers-outside-views
user664833

6

@fguillenএর প্রতিক্রিয়া বন্ধ পিগব্যাকিং , আমি number_to_currencyআমার ApplicationHelperমডিউলটিতে পদ্ধতিটি ওভাররাইড করতে চেয়েছিলাম যাতে মানটি হয় 0বা blankএটি পরিবর্তে কোনও ড্যাশ আউটপুট দেয়।

আপনার ছেলেরা যদি এই জাতীয় কিছু কার্যকর খুঁজে পেতে পারে তবে আমার কোডটি এখানে:

module ApplicationHelper
  def number_to_currency(value)
    if value == 0 or value.blank?
      raw "&ndash;"
    else
      ActionController::Base.helpers.number_to_currency(value)
    end
  end
end


3

@ fguillen পথ, ভাল, যদিও এখানে একটি সামান্য ক্লিনার পদ্ধতির বিশেষ করে দেওয়া যে প্রশ্ন দুটি রেফারেন্স করে তুলেছে to_dollar। আমি প্রথমে রায়ান বাটসের কোডটি ব্যবহার করব ( http://railscasts.com/episodes/132-helpers-outside-views )।

def description
  "This category has #{helpers.pluralize(products.count, 'product')}."
end

def helpers
  ActionController::Base.helpers
end

কলটি লক্ষ্য করুন helpers.pluralize। পদ্ধতির সংজ্ঞা ( def helpers) এর কারণে এটি সম্ভব , যা কেবল ফিরে আসে ActionController::Base.helpers। সুতরাং helpers.pluralizeজন্য সংক্ষিপ্ত ActionController::Base.helpers.pluralizehelpers.pluralizeদীর্ঘ মডিউল পাথগুলি পুনরাবৃত্তি না করে এখন আপনি একাধিকবার ব্যবহার করতে পারেন ।

সুতরাং আমি মনে করি এই নির্দিষ্ট প্রশ্নের উত্তর হতে পারে:

class Job < ActiveRecord::Base
  include JobsHelper
  def details
    return "Only " + helpers.to_dollar(part_amount_received) + 
           " out of " + helpers.to_dollar(price) + " received."
  end

  def helpers
    ActionView::Helpers::NumberHelper
  end
end

2

এটি একটি ভাল অনুশীলন নয় তবে এটি আমার পক্ষে কাজ করে!

আমদানি করতে কন্ট্রোলারে অ্যাকশনভিউ :: সহায়তাকারী :: সংখ্যাহেল্পার অন্তর্ভুক্ত। উদাহরণ স্বরূপ:

class ProveedorController < ApplicationController
    include ActionView::Helpers::NumberHelper
    # layout 'example'

    # GET /proveedores/filtro
    # GET /proveedores/filtro.json
    def filtro
        @proveedores = Proveedor.all

        respond_to do |format|
            format.html # filtro.html.erb
            format.json { render json: @proveedores }
        end
    end

    def valuacion_cartera
        @total_valuacion = 0
        facturas.each { |fac|
            @total_valuacion = @total_valuacion + fac.SumaDeImporte
        }

        @total = number_to_currency(@total_valuacion, :unit => "$ ")

        p '*'*80
        p @total_valuacion
    end
end

আশা করি এটি আপনাকে সাহায্য করবে!


2

সত্যিই অবাক হয় না যে কোনও ব্যক্তি কোনও ডেকরেটর ব্যবহারের বিষয়ে কথা বলেননি। তাদের উদ্দেশ্য হ'ল আপনি যে সমস্যার মুখোমুখি হচ্ছেন এবং তা আরও অনেক কিছু সমাধান করুন।

https://github.com/drapergem/draper

সম্পাদনা: দেখে মনে হয় গ্রহণযোগ্য উত্তরটি মূলত এরকম কিছু করার পরামর্শ দেয়। তবে হ্যাঁ, আপনি সজ্জকার ব্যবহার করতে চান। আপনাকে আরও বুঝতে সহায়তা করার জন্য এখানে একটি দুর্দান্ত টিউটোরিয়াল সিরিজ রয়েছে:

https://gorails.com/episodes/decorators-from-scratch?autoplay=1

পিএস - @ এক্সিড 3 আমি নিখরচায় সদস্যতা গ্রহণ করি LOL


2

আপনি কেবলমাত্র include ActiveSupport::NumberHelperমডিউল করতে পারেন , যদি আপনার দ্বারা সংজ্ঞায়িত অতিরিক্ত বৈশিষ্ট্যগুলির প্রয়োজন না হয় ActionView

https://github.com/rails/rails/blob/44260581bec06e4ce05f3dd838c8b4736fc7eb1d/actionview/lib/action_view/helpers/number_helper.rb#L383


-5

সহায়ক ফাইলগুলি সাধারণত ফাইলগুলি দেখার জন্য ব্যবহৃত হয়। মডেল ক্লাসে এই পদ্ধতিগুলি ব্যবহার করা ভাল অনুশীলন নয়। তবে আপনি যদি ব্যবহার করতে চান তবে স্যামের উত্তরটি ঠিক আছে। বা আমি আপনাকে নিজের কাস্টম পদ্ধতি লিখতে পরামর্শ দিই।


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