簡體   English   中英

在Rails中干燥重復的方法和路線

[英]Dry repeated methods and routes in Rails

我是ruby / rails的新手,這種情況有3種資源,其中使用了acts_as_votable gem提供的注釋。 問題是,我在所有資源中都添加了必要的方法和路由,從而實現了完全的非干像差。

我的路線是:

 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

有人可以幫我學習如何弄干這種情況嗎? 謝謝。

嘗試鐵軌路線問題

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並將其ThingasControllerThingbsController子類化。 您可以調用before動作來設置@votable實例變量,並讓子類設置該變量。 共享方法將放在一個地方。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM