1

我正在编写一个抓取数据的基本应用程序。我的routes.rb.

Rails.application.routes.draw do
constraints subdomain: 'api' do
 namespace :api, path: '/' do
   resources :apps, :only => :show
 end
end

在控制器中,我有类似的东西,尽管我不确定资源是如何连接到控制器的。

class AppsController < ApplicationController
  def show
    puts "this works"
    respond_to do |format|
      format.json { render json: @user }
    end
  end

  def apps
    puts "my app"
  end

end

另外,我没有Model. 这是否意味着在我的资源:apps中调用 AppsController 中的一个方法apps?如果我希望它不调用应用程序,那怎么可能?

  • rails 中的控制器如何知道它属于哪个路由
  • 我正在尝试添加一个 GET /apps?filter=5,它以 JSON 的形式返回我的抓取数据,并使用过滤器作为参数,这意味着向我返回 5 个 JSON 对象
4

3 回答 3

1
#config/routes.rb
constraints subdomain: 'api' do
   namespace :api, path: '/' do
       get :apps, to: "apps#apps", on: :collection #-> api.url.com/apps
   end
end

一个更连贯的方法是......

#config/routes.rb
constraints subdomain: 'api' do
   namespace :api, path: '/' do
       resources :apps #-> api.url.com/apps -> apps#index
   end
end

我认为您对 Rails 的工作方式感到困惑,尤其是您的数据。

我一直在发这个,也许它会帮助你:

在此处输入图像描述

如您所见,您的请求不绑定到特定的“模型”,也没有绑定到它的控制器。我将在一分钟内解释导轨MVC模型视图控制器)方面的重要性。

您的思考过程是每个请求/资源都必须有一个相应的模型/数据集可以从中提取。严格来说,情况并非如此,尽管许多人会相信它。

请记住,Rails 只是一个应用程序框架——它必须使用与其他框架和语言相同的协议和限制。

当您向 Rails 发送请求(通过您的浏览器 URL)时,它会接收该请求,并将其匹配到适当的控制器。然后,此控制器操作将从您的模型中提取数据(如果您已将其设置为那样),使用该数据呈现视图,并将处理后的 HTML 返回到浏览器。

因此,您不必将模型绑定到特定的控制器操作或任何东西。你只需要确保你的控制器和视图被相应地映射。


面向对象

在此处输入图像描述

我认为您所迷恋的部分是Ruby/Rails 的面向对象特性。

尽管 Rails 框架的每个部分都用于处理对象,但这仅适用于请求。

例如,虽然通常建议让您的控制器资源丰富,但如果您不想这样做,则不必遵守该方法。很多新手不知道有什么区别。

因此,当您使用以下内容时:

#config/routes.rb
constraints subdomain: 'api' do
 namespace :api, path: '/' do
   resources :apps, only: :show #-> api.url.com/:id -> apps#show
 end
end

...您所指的是一个受其资源丰富的性质约束的控制器。通常预计这将使用模型数据,但这不是必需的......

在此处输入图像描述

于 2015-10-09T06:40:19.300 回答
1

在控制器中,我有类似的东西,尽管我不确定资源是如何连接到控制器的。

Rails.application.routes.draw提供挂钩到 Rack(HTTP 服务器和 Rails 之间的接口)的 DSL。它为从 Rack 路由响应的位置生成规则。

DSL 提供了很多方法来做同样的事情。在此示例中,该resources :apps, :only => :show行基本上表示您要为 生成所有 REST 动词AppsController,但您只需要:show动词,因此路由器只会生成到 的路由AppsController#show。请注意,您可以运行rake routes以获取路线列表。

另外,我没有模型。这是否意味着在我的资源中:apps 调用了 AppsController 中称为应用程序的方法?如果我希望它不调用应用程序,那怎么可能?

模型是完全独立的抽象。一旦代码到达您的控制器,您就处于普通的 Ruby 领域,直到您退出该控制器操作。模型只是简单的 Ruby 对象,具有与数据库对话的能力。

在您的代码中,如果您想appsshow方法(或操作)调用,那么您可以从那里调用它,因为它在同一范围内。

Rails 中的控制器如何知道那是我的路线。在这种情况下,应用

我不确定我是否理解这个问题,你能详细说明一下吗?

我正在尝试添加一个 GET /apps?filter=5,它以 JSON 的形式返回我的抓取数据,并使用过滤器作为参数,这意味着向我返回 5 个 JSON 对象

首先,您需要为/apps. 有几种方法可以做到这一点。这是一种方法。我将调用它index而不是apps因为这更传统:

# config/routes.rb
get '/apps' => 'apps#index'

# app/controllers/apps_controller.rb
class AppsController < ApplicationController
  respond_to :json

  def index
    limit = params[:filter].to_i
    @users = User.first(limit) # Implement this however you wish
    respond_with(@users)
  end
end

我的语法可能与respond_toand有点不同respond_with,但它应该解释控制器如何路由

于 2015-10-09T11:15:51.317 回答
1

路由只是将 URL 映射到控制器/动作,同名模型的存在无关紧要。

要获得apps您在 AppsController 中定义的动作,您需要定义一个映射到apps#apps< 此语法的意思是AppsControllerapps动作的路由。

将映射到 AppsControllerapps操作的路由示例:

get '/apps', to: "apps#apps"

这是一个奇怪的例子。里面有一个def apps动作是不常规的AppsController,你到底想用这个动作来完成什么?

如果你想要一个返回一个 JSON 应用列表的 /apps 调用,那么这就是你需要做的。

路由器

resources :apps, only: [:index]

控制器

class AppsController < ActionController::Base

  def index
    puts "This is the index route in AppsController"
  end

end

在路由器中,当您指定resource :apps, only: [:index]. 这会将请求路由GET /appsAppsController#index

于 2015-10-09T05:13:56.023 回答