我正在尝试用rails 4构建一个小小的todo应用程序并做出反应。没有什么困难,这只是学习如何使用rails的一个开始,但我在如何编写rails控制器方面遇到了困难。
我想做的事情很简单:我希望rails总是用react应用程序呈现视图,而不管用于访问网站的url是什么。我的应用程序中的所有控制器(比如Todos控制器)都用于检索JSON数据,这些数据将被react操作。
我找到的解决方案是将react应用程序放到应用程序布局中。这样,当有人第一次登陆网站时,它就会一直存在。因为它在布局中,它将不会再次呈现,react应用程序可以完成它的工作。
我的控制器看起来是这样的:
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文件:
root "front#index"
namespace :api, constaints: { format: 'json' } do
resources :todos, only: [:index, :create, :delete, :show]
end
get '*path' => "front#index", via: :all我的新Todos控制器:
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,则不会呈现任何内容。
发布于 2016-04-25 06:28:18
为什么不使用pages#index作为根路径呢?这样,TodosController只负责为您的应用程序提供后端服务。
作为另一项措施,您可以强制执行请求和响应都是JSON格式。至于它的实现,this是一个很好的起点。
https://stackoverflow.com/questions/36828705
复制相似问题