2015-03-04 4 views
0

у меня есть приложение рельсы, где многие из моделей можно редактировать с помощью best_in_place, поэтому у меня есть много контроллеров, которые выглядят частично как это:Rails 4 с помощью контроллера относится к СУХИМ методам обновления

before_action :find_objects, except: [:new, :create] 

def update 
    @object.update_attributes(object_params) 
    respond_to do |format| 
    format.json { respond_with_bip @object} 
    end 
end 

private 

def object_params 
    params.require(:object).permit(:foo, :bar) 
end 

def find_objects 
    @object = Object.find(params[:id]) 
end 

Как я переместите эту конкретную повторяющуюся часть в проблему с контроллером, учитывая, что обновляемый объект будет входить с определенным именем в хэше params, а object_params и find_objects должны называть их правильные версии на основе имени модели? Есть ли какая-то элегантная мета-магия, которая все это разобрат?

+0

Вы можете попробовать драгоценный камень 'inherited_resources'. – Kuldeep

+0

Интересно, но слишком плохо, что он устарел и устарел. – grosa

ответ

3

Я думаю, что это случай, когда ваш код может быть «слишком сухим». Вы можете, конечно, выполнить это с помощью метамагии, но это может привести к запутыванию вашего кода в долгосрочной перспективе.

Если вы хотите сделать метамагию, один трюк - использовать params[:controller], чтобы получить название модели. Например, если у вас есть PostsController, то:

params[:controller] # => "posts" 
params[:controller].classify # => "Post" 

Принимая это шаг вперед, вы могли бы написать общий find_object так:

def find_object 
    model_class = params[:controller].classify.constantize 
    model_instance = model_class.find(params[:id]) 
    instance_variable_set("@#{model_class.name.underscore}", model_instance) 
end 

Но, как я уже сказал в начале, я Не уверен, что я рекомендовал бы эту сумму абстракции только ради СУЩЕСТВУЮЩЕГО кода вашего контроллера.

+0

Я также понял, что вы можете использовать 'self.class' для получения класса контроллера и делать подобное без использования хэша params. – grosa

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