2016-11-14 7 views
0

私はruby/railsの新機能ですが、私はacts_as_votable gemが提供するコメントを使用する3つのリソースを持っています。問題は、すべてのリソースに必要な方法とルートを追加して、完全な非乾燥収差が生じることです。Railsで繰り返される方法と経路

私のルートは以下のとおりです。コントローラーで

Rails.application.routes.draw do 
    root to: 'home#index' 

    get 'home/index', to: 'home#index' 

    resources :users 

    get 'thinga/tagged/:tag', to: 'thinga#tags', as: 'tagged_thingas' 
    get 'thingb/tagged/:tag', to: 'thingb#tags', as: 'tagged_thingbs' 

    resources :thinga do 
    member do 
     get :like 
     get :dislike 
     get :unvote 
    end 
    end 

    resources :thingb do 
    member do 
     get :like 
     get :dislike 
     get :unvote 
    end 
    end 

    resources :thingc, only: [:create, :update, :destroy] do 
    member do 
     get :like 
     get :dislike 
     get :unvote 
    end 
    end 

    devise_for :users, path: 'auth', 
    :controllers => { :omniauth_callbacks => 'omniauth_callbacks' } 
end 

繰り返しコードが

def like 
    @thinga = Thinga.find(params[:id]) 
    @thinga.liked_by current_user 
    respond_to do |format| 
     format.html { redirect_to :back } 
     format.js { render layout: false } 
    end 
    end 

    def dislike 
    @thinga = Thinga.find(params[:id]) 
    @thinga.disliked_by current_user 
    respond_to do |format| 
     format.html { redirect_to :back } 
     format.js { render layout: false } 
    end 
    end 

    def unvote 
    @thinga = Thinga.find(params[:id]) 
    @thinga.unvote_by current_user 
    respond_to do |format| 
     format.html { redirect_to :back } 
     format.js { render layout: false } 
    end 
    end 

ある誰かが、この例をしてくださいオフに乾燥する方法を学ぶために私を助けることができます?。ありがとうございました。

答えて

2

てみレールのルートは

http://edgeguides.rubyonrails.org/routing.html#routing-concerns

懸念と私はあなたがコントローラの場合、この

concern :votable do 
    member do 
    get :like 
    get :dislike 
    get :unvote 
    end 
end 

resources :thinga, :thingb, :concerns => :votable 
resources :thingc, :concerns => :votable, only: [:create, :update, :destroy] 

を行うことができると思う - ください:おそらく、次のコードが実行されますVotablesControllerであり、ThingasControllerまたはThingbsControllerにサブクラス化されています。前のアクションを呼び出して@votableインスタンス変数を設定し、そのサブクラスに変数を設定させることができます。共有方法は1か所にあります。サブクラスで

class VotablesController < ApplicationController 

    before_action :set_votable 

    def like 
    @votable.liked_by current_user 
    respond_to do |format| 
     format.html { redirect_to :back } 
     format.js { render layout: false } 
    end 
    end 

    def dislike 
    @votable.disliked_by current_user 
    respond_to do |format| 
     format.html { redirect_to :back } 
     format.js { render layout: false } 
    end 
    end 

    def unvote 
    @votable.unvote_by current_user 
    respond_to do |format| 
     format.html { redirect_to :back } 
     format.js { render layout: false } 
    end 
    end 

end 

(これはthingaための一例である)

class ThingasController < VotablesController 

    def set_votable 
    @votable = Thinga.find(params[:id]) 
    end 

end 
0

Rubyはコードを書くためにコードを使用するための多くのスコープを提供します(メタプログラミング)ので、繰り返しルートを追加する作業を行うメソッドを書くことができます。

Rails.application.routes.draw do 
    def create_votes_resources(name, options = {}) 
    resources name, options do 
     member do 
     get :like 
     get :dislike 
     get :unvote 
     end 
    end 
    end 

    create_votes_resources :thing_a 
    create_votes_resources :thing_b 
    create_votes_resources :thing_c, only: [:create, :update, :destroy] 
end 
+1

ならびにコントローラメソッドのDRY解決策を提供することができます。私はおそらく、これを処理するためのモジュールを用意しています。 – engineersmnky

関連する問題