首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails +Rails路由配置

Rails +Rails路由配置
EN

Stack Overflow用户
提问于 2016-04-24 20:44:40
回答 1查看 1.1K关注 0票数 1

我正在尝试用rails 4构建一个小小的todo应用程序并做出反应。没有什么困难,这只是学习如何使用rails的一个开始,但我在如何编写rails控制器方面遇到了困难。

  • 目前可以访问的两个urls是"mysite.local",用于显示所有的待办事项,"mysite.local/todos/1"用于显示具有更多详细信息的特定的待办事项。
  • 我有一个 todos 控制器,用于响应与todo相关的AJAX调用。
  • 包含react应用程序的视图不是一个" todos“视图,因为我将在未来添加不仅仅是todos,而且react应用程序将不得不处理所有的事情。

我想做的事情很简单:我希望rails总是用react应用程序呈现视图,而不管用于访问网站的url是什么。我的应用程序中的所有控制器(比如Todos控制器)都用于检索JSON数据,这些数据将被react操作。

我找到的解决方案是将react应用程序放到应用程序布局中。这样,当有人第一次登陆网站时,它就会一直存在。因为它在布局中,它将不会再次呈现,react应用程序可以完成它的工作。

我的控制器看起来是这样的:

代码语言:javascript
复制
class TodosController < ApplicationController

def index
    respond_to do |format|
        format.html
        format.json { Todo.all }
    end
end

def create
    respond_to do |format|
        format.html
        format.json { Todo.create(todo_params) }
    end
end

def show
    respond_to do |format|
        format.html
        format.json { Todo.find(params[:id]) }
    end
end

private
    def todo_params
        params.require(:todo).permit(:content)
    end
end

使用这样的控制器,我可以进行AJAX调用并获得JSON,这是我的控制器将发送的唯一数据,同时我仍然可以到达"mysite.local/todos/1",rails除了呈现一个空视图之外什么也不做。

此方法有效,但我不喜欢它,因为控制器为每个操作呈现一个视图。当某人第一次到达该网站时,将呈现一个空视图。即使视图是空的,并且它不会在浏览器上显示任何内容,rails仍然必须完成所有的过程来呈现视图。我不知道这个过程是否真的花费了一些钱,但我不喜欢我的应用程序正在做一些无用的事情。

如果格式操作是html,是否有任何方法告诉rails不做任何事情?(=不呈现"index“或"show”视图?)

还是有更好的方法来做我想做的事?

谢谢

编辑

多亏了戈布列戈,我修改了一下我的申请。我创建了一个Front控制器来处理客户端部分。然后,我将我的Todos控制器移动到一个api文件夹中。

下面是我的routes.rb文件:

代码语言:javascript
复制
root "front#index"

namespace :api, constaints: { format: 'json' } do
  resources :todos, only: [:index, :create, :delete, :show]
end

get '*path' => "front#index", via: :all

我的新Todos控制器:

代码语言:javascript
复制
class Api::TodosController < ApplicationController
respond_to :json
before_action :ensure_json_request 

def index
    respond_with Todo.all 
end

def create
    respond_with Todo.create(todo_params)
end

def show
    respond_with Todo.find(params[:id])
end

private
def todo_params
    params.require(:todo).permit(:content)
end

def ensure_json_request  
  return if request.format == :json
  render :nothing => true, :status => 406  
end 
end

这样,所有的url都由front#index来处理,除了所有的apis,这就是我想要的。例如,如果有人试图在浏览器中访问mysite.local/api/todos,为了确保不呈现任何内容,将使用before_action,如果格式不是json,则不会呈现任何内容。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-25 06:28:18

为什么不使用pages#index作为根路径呢?这样,TodosController只负责为您的应用程序提供后端服务。

作为另一项措施,您可以强制执行请求和响应都是JSON格式。至于它的实现,this是一个很好的起点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36828705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档