LoginSignup
48
49

More than 5 years have passed since last update.

Scaffold作成時にJSON関連のコードを生成しないようにする

Posted at

問題

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 { ... }のような行を削除する。

48
49
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
48
49