как извлечь логику из представлений - PullRequest
0 голосов
/ 12 ноября 2018

В моем приложении я могу искать consumptions по датам

У меня есть активная модель записи Потребление , которая belongs_to :users и модель ПотреблениеSearch

потребление.rb

class Consumption < ApplicationRecord
    belongs_to :user
end

потребление_поиск.рб

class ConsumptionSearch 
    attr_reader :date_from, :date_to

    def initialize(params)
        params ||= {}
        @date_from = parsed_date(params[:date_from],Time.now.beginning_of_month.to_date.to_s)
        @date_to   = parsed_date(params[:date_to], (Date.today + 1).to_s)
    end

    def date_range
        Consumption.where('created_at BETWEEN ? AND ?', @date_from, @date_to)
    end

    private
        def parsed_date(date_string, default)
            Date.parse(date_string)
            rescue ArgumentError, TypeError
            default
        end
end

В действии consumptions_controller в действии index я могу получить требуемые расходы по дате

class ConsumptionsController < ApplicationController
    def index
        @search = ConsumptionSearch.new(params[:search])
        @consumptions = @search.date_range
        @consumptions = @consumptions.order('created_at ASC').where(user_id: current_user.id)
    end
end

Схема потребления может помочь:

  create_table "consumptions", force: :cascade do |t|
    t.float "total_price"
    t.float "kilometers"
    t.string "shop"
    t.float "liter_price"
    t.float "total_liters"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer "user_id"
    t.float "difference", default: 0.0
  end

Так что в моем consumptions/view/index.html.erb мне просто нужно перебрать @consumptions, чтобы отобразить то, что мне нужно.

Вопрос в следующем:

Как я могу сделать это более "рубиновым путем", у меня слишком много логики в представлении ... Где и как мне извлечь логику?спасибо

<%= price = (@consumptions.map { |c| c.total_price }.sum - @consumptions.last.total_price).round(2) %> 
<%= total_km = (@consumptions.map { |c| c.difference }.sum).round.abs %>
<%= (price / total_km).round(4) %> 
<%= (price / total_km * 100).round(2) %>

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Почему бы не добавить логику в ваш ConsumptionSearch класс? Вы уже абстрагируете логику к этому. И вы уже получаете доступ к нему в представлении. Итак, возможно что-то вроде:

class ConsumptionSearch 
  attr_reader :date_from, :date_to

    def initialize(params)
      params ||= {}
      @date_from = parsed_date(params[:date_from],Time.now.beginning_of_month.to_date.to_s)
      @date_to   = parsed_date(params[:date_to], (Date.today + 1).to_s)
    end

    def date_range
      Consumption.where('created_at BETWEEN ? AND ?', @date_from, @date_to)
    end

    def price
      ...
    end

    def total_km
      ...
    end

    def price_per_km(round_to)
      (price/total_km).round(round_to)
    end

  private

    def parsed_date(date_string, default)
      Date.parse(date_string)
      rescue ArgumentError, TypeError
      default
    end
end

А потом в поле зрения:

<%= @consumptions.price %> 
<%= @consumptions.total_km %>
<%= @consumptions.price_per_km(4) %> 
<%= @consumptions.price_per_km(2) %>

Лично helpers не моя любимая вещь. Но я понимаю, что некоторые люди используют их регулярно и с большим успехом. Я просто странный в этом смысле.

0 голосов
/ 12 ноября 2018

Вы можете создать помощника: app / helpers / consumptions_helper.rb

module ConsumptionsHelper
 def some_logic
   ...
 end
end

и используйте его в представлении

<%= some_logic %>

Пожалуйста, проверьте RoR документ здесь https://api.rubyonrails.org/classes/ActionController/Helpers.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...