[英]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
並將其ThingasController
或ThingbsController
子類化。 您可以調用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.