Это не был просто набор переменных в маскарадном костюме, потому что это имелось десятки обязанностей, как связь со слоем персистентности для сохранения/получения данных о компании, соглашении с сотрудниками и ценовыми наборами, и т.д.
я должен сказать, что Вы действительно не описываете что-то, что должно быть отдельным объектом, и это спорно, что любой из них, кроме Сериализации Данных должен был быть одиночным элементом.
я вижу по крайней мере 3 набора классов, в которых я обычно разрабатывал бы, но я склонен одобрять меньшие более простые объекты, которые делают узкий набор задач очень хорошо. Я знаю, что это не природа большинства программистов. (Да я работаю над 5 000 чудовищ класса строки каждый день, и у меня есть специальная любовь к методам строки 1200 года, которые пишут некоторые люди.)
я думаю дело в том, что в большинстве случаев Вам не нужны одиночный элемент и часто Ваше просто создание Вашей жизни тяжелее.
Я понял, что способ, которым я хочу представить свои ресурсы, просто выходит за рамки обычных ресурсов Rails, и это нормально. Проблема, с которой я действительно сталкивался, заключалась в том, что каждый раз, когда я добавлял другое действие и именовал маршрут, чтобы добраться до того, что я хотел, это было неправильно, я повторял себя как в своих маршрутах, так и в своих действиях.
Я вернулся к простому созданию своих назвал маршруты и провел немного больше времени в контроллере, чтобы упростить свои маршруты. Ниже представлено то, что у меня есть сейчас, и меня это устраивает.
#routes.rb
map.with_options :controller => 'sketched_images', :action => 'show', :path_prefix => '/sketches', :name_prefix => 'sketched_', :color => 'grey' do |m|
m.style "styles/:style/:color/:size.:format"
m.design "designs/:design/:color/:size.:format"
m.product "products/:product/:color/:size.:format"
m.color_combo "colored_products/:color_combo/:size.:format"
end
class SketchedImagesController < ApplicationController
caches_page :show
before_filter :load_data
def show
@size = params[:size] || 100
respond_to do |wants|
wants.png
wants.jpg
end
end
private
def load_data
case
when params[:design]
@image = ClothingDesign.from_param(params[:design]).sketched_image
greyed
when params[:style]
@image = ClothingStyle.from_param(params[:style]).sketched_image
greyed
when params[:product]
@image = Product.from_param(params[:product]).sketched_images.first
greyed
when params[:color_combo]
@color_combo = ColorCombo.find_by_id(params[:color_combo])
@object = @color_combo.colorable
if @object.active? && !@object.sketched_images.blank?
@image = @object.sketched_images.first
colored
else
@image = @product.style.sketched_image
dimmed
end
end
end
def greyed
@blank = "#FFF"
@print = "#000"
@highlight = "#666"
end
def colored
@blank = "##{@color_combo.blank_color.value}"
@print = "##{@color_combo.design_color.value}"
@highlight = "##{@color_combo.highlight_color.value}" unless @color_combo.highlight_color.blank?
end
def dimmed
@blank = "#BBB"
@print = "#000"
@highlight = "#444"
end
end
There's no good way to remove the controller/id part of a resource. The closest you're going to get through tricking ActionController with something like this:
map.resources :gray, :path_prefix => "/images/:product/:image_id/",
:controller => 'images', :requirements => {:colour => "gray"}
Which will produce routes like www.site.com/images/product/4/gray/1234.html
with the following params hash:
params => {
:image_id => 4,
:id => 1234,
:colour => "gray",
:product => "product"
}
The format won't be passed explicitly but it will be available in the controller through the usually respond_to means.
Next you'll have to work some magic in controller to trick rails into doing what you want.
class ImagesController < ApplicationController
def show
@size = params[:id]
@image = Image.find(params[:image_id])
...
end
end
This actually works better as a filter so:
class ImagesController < ApplicationController
def initialize_colour
unless params[:colour].nil?
@size = params[:id]
@colour = params[:colour]
@image = Image.find(params[:image_id])
end
end
before_filter :initialize_colour, :except => [:index, :new, :create]
...
end
However to make good use of these routes, you're going to have to pass all those extra parameters to your url for calls. Like this:
gray_url(size, :image_id => @image.id, :product => product)
But helpers make that easy.
module ApplicationHelper
def easy_gray_url(image, size, product)
gray_url(size, :image_id => image.id, :product => product)
end
end
Ознакомьтесь с документация для ресурсов . Вы найдете это:
Метод ресурсов принимает следующие параметры для настройки итоговые маршруты: *: requirements - Установить требования к настраиваемым параметрам маршрутизации; это хэш либо регулярных выражений (которые должны совпадать, чтобы маршрут соответствовал), либо дополнительных параметров. Например:
map.resource: profile,: path_prefix => ': name',: requirements
=> {: name => / [a-zA-Z] + /,: extra => 'value'}
будет соответствовать, только если первая часть является буквенной, и передаст параметр: extra в контроллер. **