2016-03-15 3 views
1

мне было интересно, если это возможно, чтобы создать метод частичного рубина на рельсах, например, у меня есть этот код, -Рубин на рельсах метод частичных?

@cart = Cart.where(:user_id => current_user.id).first if user_signed_in? 
@slots = @cart.slots.first 
@slot_list = [@slots.slot_one, @slots.slot_two, @slots.slot_three, @slots.slot_four, @slots.slot_five, 
       @slots.slot_six, @slots.slot_seven, @slots.slot_eight, @slots.slot_nine, @slots.slot_ten] 
@user_products = [] 
@product = [] 
@slot_list.each do |item| 
    if item.nil? 
    p 'Item empty' 
    else 
    @product << item 
    end 
end 
@product.each do |item| 
    items = Product.where(:product_id => item).first 
    @user_products << items 
end 

Написано в несколько методов, чтобы получить @user_products, мне было интересно, если там был так что мне не нужно писать все это время и, возможно, запустить метод или использовать частичный?

Стоит ли создавать помощник, который делает это, и возвращает переменную @user_products?

+0

Да, в рубине вы можете извлекать вещи в методы. «Метод извлечения», вероятно, является наиболее распространенным методом рефакторинга (сразу после «Переименования», конечно). –

+0

Здравствуйте, я только что отправил ответ и создал два вспомогательных метода, можно ли их использовать? –

+0

Эй, Адам. Я могу настроить чат, если хотите, поэтому мы можем обсудить это без длинной строки комментариев. ЛМК. – jvillian

ответ

0

Я взял свой совет и создал двух помощников, один из которых, чтобы вернуть @user_products, а другой, чтобы вернуть @total.

Я добавил имена методов нашей helper_method

helper_method :user_is_admin?, :authenticate_admin!, :product_available?, :get_user_products!, :get_user_total! 

Затем добавляют эти два метода в нижней части файла; -

get_user_products!

def get_user_products! 
     @cart = Cart.where(:user_id => current_user.id).first if user_signed_in? 
    @slots = @cart.slots.first 
    @slot_list = [@slots.slot_one, @slots.slot_two, @slots.slot_three, @slots.slot_four, @slots.slot_five, 
        @slots.slot_six, @slots.slot_seven, @slots.slot_eight, @slots.slot_nine, @slots.slot_ten] 
    @user_products = [] 
    @product = [] 
    @slot_list.each do |item| 
    if item.nil? 
     p 'Item empty' 
     else   
     @product << item 
    end 
    end 
     @product.each do |item| 
     items = Product.where(:product_id => item).first 
     @user_products << items 
    end 
    return @user_products 
end 

get_user_total!

def get_user_total! 
@total = 0 
    @cart = Cart.where(:user_id => current_user.id).first if user_signed_in? 
    @slots = @cart.slots.first 
    @slot_list = [@slots.slot_one, @slots.slot_two, @slots.slot_three, @slots.slot_four, @slots.slot_five, 
        @slots.slot_six, @slots.slot_seven, @slots.slot_eight, @slots.slot_nine, @slots.slot_ten] 

    @user_products = [] 
    @product = [] 
    @slot_list.each do |item| 
    if item.nil? 
     p 'Item empty' 
     else   
     @product << item 
    end 
    end 
     @product.each do |item| 
     items = Product.where(:product_id => item).first 
     @user_products << items 
    end 
    @user_products.each do |p| 
     @total += p.product_price 
    end 
    return @total 
end 

Чтобы использовать эти методы внутри любой контроллер вы выполните следующие действия, -

@user_products = get_user_products! 
@total = get_user_total! 
+0

В течение долгого времени я помещал такие вещи в помощники. Теперь я думаю, что это плохая идея. Вот фрагмент, который вы можете найти интересным: http://blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat-activerecord-models/ Мое предпочтение - идти по маршруту PORO. В качестве бонуса, POROs легче тестировать, чем коллайдеры (в RSpec). – jvillian

0

Я предполагаю, что это в контроллере?

Вы хотите использовать простые старые объекты Ruby (POROs). Таким образом, вы могли бы иметь что-то вроде этого:

class UserProducts 
    class << self 

     def get(options={}) 
     @cart = Cart.where(:user_id => current_user.id).first if user_signed_in? 
     @slots = @cart.slots.first 
     @slot_list = [ 
      @slots.slot_one, 
      @slots.slot_two, 
      @slots.slot_three, 
      @slots.slot_four, 
      @slots.slot_five, 
      @slots.slot_six, 
      @slots.slot_seven, 
      @slots.slot_eight, 
      @slots.slot_nine, 
      @slots.slot_ten 
     ] 

     @user_products = [] 
     @product = [] 
     @slot_list.each do |item| 
     if item.nil? 
      p 'Item empty' 
     else     
      @product << item 
     end 
     end 
     @product.each do |item| 
     items = Product.where(:product_id => item).first 
     @user_products << items 
     end 
    end 
    end 

Затем в контроллере, вы могли бы сделать что-то вроде:

class FooController < ApplicationController 
    def index 
    UserProducts.get(user_id: current_user.id) 
    end 
end 

Так, UserProducts существу объект службы. Я думаю, что некоторые люди называют их прецедентами. Я обычно называю их «менеджерами». Я помещал их в свой собственный каталог как app/managers/user_products.rb.

+0

Эй, я знаю, что с тех пор прошло какое-то время, но я просто пробовал это сегодня - я понял, что вы теперь подразумеваете под помощниками ... Я выучил свой урок, он слишком полон методов. Я попробовал это, но я не могу получить доступ к классу UserManger, когда он находится в его собственной папке, например app/manager, он должен находиться в той же папке, что и контроллер, который использует его, как мне сделать эту работу? –

+0

Hm. Какие рельсы вы используете? Он должен автозагружаться, если у вас есть небольшие ошибки в именах папок и/или пространствах имен. Каково ваше имя менеджера? Каковы структуры вашего каталога? Вы получаете постоянную ошибку? – jvillian

+0

Я использую Rails4.2.5, и я попытался поместить папку в app/manager/userManger.rb, затем попробовал приложение/контроллеры/менеджеры/user_manager.rb. –

Смежные вопросы