問題
Railsでscaffoldを作成すると、デフォルトでapp/views/user_infos/index.json.jbuilder
のようなJSON API用のコードが生成される。
JSONのAPIを必要としないRailsアプリケーションであれば、こういったコードは不要。
むしろ、悪意のあるユーザーによってAPI経由で機密情報を取得される恐れがある。
(開発者がAPIの出力内容を気をつけて確認していない場合)
参考: Rails Scaffold's Dangerous Defaults
対象バージョン
- Rails 4.2.0
解決策その1
jbuilder gemをGemfileから削除する。(jbuilderを全く必要としない場合)
参考: Skip JSON format in rails generate scaffold
# gem 'jbuilder'
scaffoldを作成しても、xxx.json.jbuilder
は生成されない。
bundle install
rails g scaffold blog title content:text
invoke active_record
create db/migrate/20150220000736_create_blogs.rb
create app/models/blog.rb
invoke test_unit
create test/models/blog_test.rb
create test/fixtures/blogs.yml
invoke resource_route
route resources :blogs
invoke scaffold_controller
create app/controllers/blogs_controller.rb
invoke erb
create app/views/blogs
create app/views/blogs/index.html.erb
create app/views/blogs/edit.html.erb
create app/views/blogs/show.html.erb
create app/views/blogs/new.html.erb
create app/views/blogs/_form.html.erb
invoke test_unit
create test/controllers/blogs_controller_test.rb
invoke helper
create app/helpers/blogs_helper.rb
invoke test_unit
invoke assets
invoke coffee
create app/assets/javascripts/blogs.coffee
invoke scss
create app/assets/stylesheets/blogs.scss
invoke scss
create app/assets/stylesheets/scaffolds.scss
Controllerにもformat.json { ... }
のようなコードが生成されない。
# Controller
class BlogsController < ApplicationController
before_action :set_blog, only: [:show, :edit, :update, :destroy]
# GET /blogs
def index
@blogs = Blog.all
end
# GET /blogs/1
def show
end
# GET /blogs/new
def new
@blog = Blog.new
end
# GET /blogs/1/edit
def edit
end
# POST /blogs
def create
@blog = Blog.new(blog_params)
if @blog.save
redirect_to @blog, notice: 'Blog was successfully created.'
else
render :new
end
end
# PATCH/PUT /blogs/1
def update
if @blog.update(blog_params)
redirect_to @blog, notice: 'Blog was successfully updated.'
else
render :edit
end
end
# DELETE /blogs/1
def destroy
@blog.destroy
redirect_to blogs_url, notice: 'Blog was successfully destroyed.'
end
private
# Use callbacks to share common setup or constraints between actions.
def set_blog
@blog = Blog.find(params[:id])
end
# Only allow a trusted parameter "white list" through.
def blog_params
params.require(:blog).permit(:title, :content)
end
end
JSON API関連のコードが生成されなくなる理由
JSON API関連のコードが生成されるのは、jbuilder gemがtemplateをオーバーライドしているため。
よってjbuilder gemを削除すると、JSON API関連のコードも生成されなくなる。
参考: https://github.com/rails/jbuilder/tree/master/lib/generators/rails/templates
解決策その2
application.rb
でgeneratorの設定を変更する。
config.generators do |g|
# ...
g.jbuilder false
end
ただし、この場合はxxx.json.jbuilder
が生成されなくなるだけなので、blogs/1.json
のようなURLにアクセスすると Missing Template エラーが発生する。
このエラーも防ぎたい場合はcontrollerからformat.json { ... }
のような行を削除する。