Desenvolvedores experientes de ROR sabem sobre as diferenças entre desenvolvimento e produção. Descrevi alguns deles aqui, que não conhecia antes:
#config/routes.rb
resources :pages do
get ":slug" => "pages#show"
end
#app/controllers/pages_controller.rb
def show
@page = Page.find_by_slug params[:slug]
end
Em desenvolvimento, esta construção de rotas fornecerá parâmetros:
{"controller"=>"web/pages", "action"=>"show", "slug"=>"slug"}
Mas na produção vai te dar:
{"controller"=>"web/pages", "action"=>"show", "id"=>"slug"}
O valor “slug” tem a chave “id”, não “slug”. Como resultado, o mesmo código nos dá resultados diferentes em ambientes diferentes. Para resolver este problema, você precisa escrever:
resources :pages do
collection do
get ":slug" => "pages#show"
end
end
O próximo exemplo é sobre decoradores. Se você usar joia draper em seu projeto. Você precisa do decorador no controlador: Admin :: UsersController
class Admin::UsersController < Admin::ApplicationController
def index
@users = UserDecorator.decorate_collection User.all
end
end
No Rails 3.2.17 em desenvolvimento o UserDecorator é o Admin :: UserDecorator , porque você usa no controlador Admin. Está bem. Você adiciona funções a Admin :: UserDecorator sem remorso.
Mas na produção o UserDecorator é o UserDecorator (!!!), então na produção você tem o método de erro indefinido alguma função em UserDecorator .
Se você deseja usar a classe UserDecorator sem Admin :: UserDecorator, você deve escrever :: UserDecorator no controlador Admin. Será UserDecorator em desenvolvimento e produção.
class Admin::UsersController < Admin::ApplicationController
def index
@users = ::UserDecorator.decorate_collection User.all
end
end
Lembre-se das diferenças entre os ambientes.