2009-12-15 4 views
1

У нас есть пользовательское действие (: register) для нашей модели местоположения. Поддерживающий код очень похож на стандарт: обновление. Поскольку inherited_resources предоставил нам «шаблон», мы скопировали код обновления из actions.rb, изменив «update_attributes» на «register», а флеш-сообщение отражало разные действия. Это не очень сухо. Мы хотели бы, чтобы использовать: вместо этого обновите. Есть идеи?Можно ли использовать произвольное действие с inherited_resources сухим способом?

class LocationsController < InheritedResources::Base 
    def register(options={}, &block) 
    #TODO: copied update from actions.rb. I expect there is a better way. 
    # All I changed was the flash message (to reflect the action) 
    # and the method call on the object (update_attributes -> register) 
    object = resource 

    if object.register 
     set_flash_message!(:notice, '{{resource_name}} was successfully registered.') 
     options[:location] ||= resource_url rescue nil 
     respond_with_dual_blocks(object, options, true, block) 
    else 
     set_flash_message!(:error) 
     respond_with_dual_blocks(object, options, false, block) 
    end 
    end 

ответ

1

Унаследованные ресурсы предоставляют вспомогательные методы для действий CRUD, которые вы можете переопределить на своем контроллере. Один вы смотрите на это

# Responsible for updating the resource in :update method. This allow you 
    # to handle how the resource is gona be updated, let's say in a different 
    # way then the usual :update_attributes: 
    # 
    # def update_resource(object, attributes) 
    #  object.reset_password!(attributes) 
    # end 
    # 
    def update_resource(object, attributes) 
    object.update_attributes(attributes) 
    end 

перенастройка это следующим образом:

class LocationController < ApplicationController 
    inherit_resources 

    protected 

    def update_resource(object, attributes) 
    object.register(attributes) 
    end 
+0

Incase кто все еще ищет это: В версии 1.3 Наследование ресурсов, то второй параметр, передаваемый update_resource теперь массив , Мне пришлось использовать атрибуты [0] внутри update_resource, чтобы получить то же поведение, что и раньше. Учитывая это изменение, вероятно, лучше не переопределять update_resource. –