2017-02-02 17 views
1

Я на Rails 5.0. Создание новых контроллеров и добавляя больше и больше кода, там я обнаружил, что у меня есть довольно много одинаковых методов в частных разделах каждого класса, какКак оставаться сухим, используя частные методы?

private 

def find_post 
    @post = Posts.find(params[:id]) 
end 

def find_user 
    @user = User.find(params[:id]) 
end 

def find_group 
    ... 
end 

и так далее.

Есть ли способ включить «стандартный» набор частных методов ко всем классам, которые в нем нуждаются?

+0

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

+0

ОК, в некоторых случаях это имеет смысл, но он повторяется во многих классах. –

+0

@AlexanderGorg Если вы хотите высушить код контроллера, и эти методы также полезны в другом контроллере, вы можете создать помощник, и вы можете включить этого помощника в свой контроллер. – ashvin

ответ

2

Вы можете использовать concerns в контроллерах так же, как вы можете в моделях.

Просто определите проблему под названием Finders или что-то в app/controllers/concerns/finders.rb, а затем include Finders, чтобы использовать ее.

отметить также, что с Рубином 2,0 def фактически возвращает символ с именем метода, так что можно сделать что-то вроде следующего:

private def find_post 
    @post = Posts.find(params[:id]) 
end 

private def find_user 
    @user = User.find(params[:id]) 
end 

Хотя это правда, что это приводит к немного более типизацию, это более явные и гораздо менее подверженные ошибкам, чем модификаторы доступа к уровню.

+0

Это действительно круто! –

0

Не могли бы вы просто наследовать от родительского контроллера, используя вместо этого защищенные методы?

class PostParentController < ApplicationController 
    before_filter :find_user # might be a different method name in Rails 5 
    before_filter :find_post 

    protected 
    def find_post 
    @post = Posts.find(params[:id]) 
    end 

    def find_user 
    @user = User.find(params[:id]) 
    end 
end 

Подкласс:

class PostChildController < PostParentController 
    def show 
    end 

    def create 
    end 

    # etc 
end 

Ruby public, private, protected methods

+1

В некоторых случаях - это решение, но у меня есть пустоты с очень разными функциями (изображение, видео, сообщение и т. Д.), Однако методы поиска пользователей, голосов, ответов и т. Д. Совершенно одинаковы. Я знал, что мне нужен какой-то модуль, но теперь я определенно знаю, что мне нужны проблемы! –

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

  • Нет связанных вопросов^_^