2009-11-13 4 views
6

をレールに余分のparamsを追加する簡単なようだが、「適切」ではないかもしれません私が何をしたいのか、ルートリソースに

のは、私がイメージリソースを持っているとしましょう、と私は、URLに基​​づいて画像を操作します。 URLで私はサイズを指定したい、それが灰色であるか、色付きであるか、淡色であるか、または他の何らかの状態であるかどうかを指定したい。

現在、このような名前のルートがいくつかあります。サイズ、::フォーマット、またはそれは「カラータイプ」です

map.gray_product_image "images/:product/:image/gray/:size.:format", :controller => 'images', :action => 'gray_product_image' 

私のためのトリックは、私がこのuseing Railsのリソースを作成した場合、私は私が指定する方法を知らないということです。

メンバールートを追加して、次のようなパラメータを指定したいと思います。

map.resources :products do |products| 
    products.resources :images, :member => {:gray_product_image => {':image/:size.:format' => :get}} 
end 

リソースルートに余分な情報を追加したかったのですが、その方法はわかりませんでした。

ご協力いただければ幸いです。 ありがとうございます。

+0

別の名前のルートはmap.cartあるアクション=> 'ショー' map.resource:カート、私を与えます'/ cart'でセッション番号[:order]に保存することができますが、Cookieが無効になっている場合はそれが中断されます。 – ToreyHeinz

+0

条件 "を使用できますか:条件 - カスタムルーティング認識条件を指定します。\ Resourcesはメソッド固有のルートの:メソッド値を設定します。 – ToreyHeinz

答えて

0

私のリソースを表現したいと思う方法は、通常の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? && [email protected]_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 
2

documentation for Resourcesをご覧ください。 *::リソースメソッドは たルートをカスタマイズする 次のオプション受け入れ

:あなたはこれを見つけることができます要件 - カスタムルーティングパラメータの要件を設定します。これは正規表現(一致するルートと一致する必要がある)か余分なパラメータのいずれかのハッシュです。例えば:

 map.resource :profile, :path_prefix => ':name', :requirements 

=> {:名=>/[-ZA-Z] + /:余分=> '値'}最初場合

のみ一致します部分はアルファベットで、コントローラに余分なパラメータを渡します**

+0

しかし、私のURLの最後に ':size'を追加することはできますが、:formatオプションの前には、 – ToreyHeinz

5

リソースのコントローラ/ ID部分を削除する良い方法はありません。あなたはこのようなものでActionControllerをだまして取得するつもりだ最も近い:

次のparamsハッシュで www.site.com/images/product/4/gray/1234.htmlのようなルートを生成します
map.resources :gray, :path_prefix => "/images/:product/:image_id/", 
    :controller => 'images', :requirements => {:colour => "gray"} 

params => { 
    :image_id => 4, 
    :id => 1234, 
    :colour => "gray", 
    :product => "product" 
} 

形式は明示的に渡されることはありませんが通常はrespond_to手段を介してコントローラ内で使用可能になります。

次に、コントローラーでいくつかの魔法を働かせて、あなたが望むことをやるようにします。

class ImagesController < ApplicationController 
    def show 
    @size = params[:id] 
    @image = Image.find(params[:image_id]) 
    ... 
    end 
end 

これは、実際にそうフィルターとして良い作品:

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 

しかしこれらの経路を十分に活用するには、通話のためにあなたのURLにすべてのそれらの余分なパラメータを渡す必要があるとしています。このように:

gray_url(size, :image_id => @image.id, :product => product) 

しかし、ヘルパーはそれを簡単にします。

module ApplicationHelper 
    def easy_gray_url(image, size, product) 
    gray_url(size, :image_id => image.id, :product => product) 
    end 
end 
+0

これは私が実際にやろうとしていることを考えるのに役立ちます。 。 それはそれだけの価値はありません。 – ToreyHeinz

+0

他に2つのオプションがあります。独自のバージョンのmap.resourcesを作成するか、必要なnamed_routesを生成する書き込みメソッドを作成します。 – EmFi

+0

お返事ありがとうございます。 – ToreyHeinz

関連する問題