Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 4 如何将许多相似的方法和视图组合成一个_Ruby On Rails 4_Refactoring - Fatal编程技术网

Ruby on rails 4 如何将许多相似的方法和视图组合成一个

Ruby on rails 4 如何将许多相似的方法和视图组合成一个,ruby-on-rails-4,refactoring,Ruby On Rails 4,Refactoring,我想将类似的方法和视图合并为一个,但仍然保留url名称,如下所示: Home/recommends/categories/shopping Home/recommends/categories/nightview Home/recommends/categories/food Home/recommends/categories/area 我不想在url中使用像“?something=xyz”这样的参数 在routes.rb中: resources :recommends, only: :in

我想将类似的方法和视图合并为一个,但仍然保留url名称,如下所示:

Home/recommends/categories/shopping
Home/recommends/categories/nightview
Home/recommends/categories/food
Home/recommends/categories/area
我不想在url中使用像
“?something=xyz”
这样的参数

routes.rb中

resources :recommends, only: :index do
  collection do
    resources :categories, only: :show, controller: 'recommends' do
      collection do
        get :food
        get :area
        get :shopping
        get :nightview
      end
    end
  end
end
在控制器中:

def food
  set_paginator
  @recommends = UserRecommend.where(category: "food").order('created_at desc').offset(@offset).limit(@limit).all
  @number_of_recommends = UserRecommend.where(category: "food").count
end

def area
  set_paginator
  @recommends = UserRecommend.where(category: "area").order('created_at desc').offset(@offset).limit(@limit).all
  @number_of_recommends = UserRecommend.where(category: "area").count
end

...
我认为:

food.html.slim
area.html.slim
shopping.slim
nightview.slim
它们使用相同的代码,只是在
h1
中使用不同的名称:

h1
  | Shopping ( or Area or Food... )
  = " (#{@number_of_recommends})"

= render partial: "layouts/paginator",
  locals: { total_items: @number_of_recommends, per_page: @limit, current_page: @page }

= render partial: "table", locals: { recommends: @recommends }
有人能帮我重构这段代码吗?

你可以(而且应该)有一条路线、一个动作和一个视图。关键是将URL的变量部分变成实际变量。您可以使用

第一,单一路线。如果您没有实际生成多个RESTful操作,则无需使用
资源

get "/recommends/categories/:category" => "categories#show"
您可以为
:类别
段添加允许的条件:

get "/recommends/categories/:category" => "categories#show", category: /food|area|shopping|nightview/
接下来,一个动作:

class CategoriesController < ApplicationController
  before_action :set_paginator

  def show
    # params[:category] is "food"/"area"/etc
    categories = UserRecommend.where(category: params[:category]).order('created_at desc')
    @recommends = categories.offset(@offset).limit(@limit)
    @number_of_recommends = categories.count
  end
end

我认为最好使用本地化来将<代码> PARAM[[类别] < /COD>转换为标题,这将给您更多的控制,而不是依赖于URL段的简单大写:

# app/views/categories/show.slim
h1
  = t params[:category]
以及:

# app/views/categories/show.slim
h1
  = t params[:category]
# config/locals/en.yml
en:
  categories:
    show:
      food: 'Food'
      area: 'Area'
      nightview: 'Night View'