1

Railsアプリを3.1.0(2.3.8から)に移植し、リファクタリングしています。現在、次の2ページに、別々のモデル/ビュー/コントローラーがあります。

http://www.youhuntandfish.com/ fishing / fishingstories / 148-late-fall-brook-trout http://www.youhuntandfish.com/ hunting / huntingstories / 104-early-nine-pointer

huntingstories」と「fishingstories」は実際には同じものなので、モデル/ビュー/コントローラーを共有したいと思います。

ここに問題があります。ビューでは、「huntingstories_path」や「fishingstories_path」などのヘルパーを使用しています。ビュー全体に一連の条件を追加して、使用する条件を選択したくありません。私がやりたいのは書くことです。

'stories_path'

そして、URLの「/hunting/」または「/fishing/」の部分を指定して、これをハンティングまたはフィッシングにマップするコードをいくつか用意します。

ルートファイルでこれを行う簡単な方法はありますか、それともビューヘルパーを作成する必要がありますか?'/ fishing/stories'と'hunting/ stories'の新しいルートを作成し、古いルートをこれらにリダイレクトできればさらに良いでしょう。

これが今のルートです。

scope 'fishing' do
    resources   :fishingstories
    resources   :fishingspots
end
scope 'hunting' do
    resources   :huntingstories
    resources   :huntingspots
end
4

1 に答える 1

1

自己宣伝のように聞こえるリスクを冒して、私はこれを実現する方法を詳しく説明したブログ投稿を書きました。

もし私があなたの立場にあったなら、私も同じようfishingstoriesに変わるでしょう。したがって、次のようなルートがあります。huntingstoriesstories

http://www.youhuntandfish.com/fishing/stories/148-late-fall-brook-trout http://www.youhuntandfish.com/hunting/stories/104-early-nine-pointer

または、冗長に見えるため、ストーリーを完全に削除します。いずれにせよ、コードはかなり似ています。あなたのroutes.rb

[:hunting, :fishing].each do |kind|
  resources kind.to_s.pluralize.downcase.to_sym, controller: :stories, type: kind
end

そしてあなたの中でstories_controller.rb

before_filter :find_story

private

def find_story
  @story = params[:type].to_s.capitalize.constantize.find(params[:id]) if params[:id]
end

最後に、あなたのヘルパーを作りますapplication_controller.rb

helper_method :story_path, :story_url

[:url, :path].each do |part|
   define_method("story_#{part}".to_sym) do |story, options = {}|
     self.send("#{story.class.to_s.downcase}_#{part}", story, options)
   end
 end

次に、story_path(@huntingstory)Railsのようなものを入力すると、それが自動的にに変換されhuntingstory_path(@huntingstory)、@ fishingstoryの場合も同様になります。そのため、この魔法のストーリーURLヘルパーをあらゆる種類のストーリーに使用できます。

于 2012-12-02T16:39:10.367 に答える