コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

RailsでフォームからじゃないPOSTリクエスト時にrenderしてみる

特異な要望を頂いたのでRailsというフレームワーク的に対応しているかの実証実験メモ。

大前提

こんな実装はおすすめできないので、素直にHTMLを表示するだけならGETリクエストを使うようにしてください…。

環境

$ bin/rails -v
Rails 5.2.2

検証

ControllerとViewをつくる

▼ app/controllers/articles_controller.rb

class ArticlesController < ApplicationController
  # 直接curlするとCSRFトークンがないエラーが出てしまうのでスキップ指定
  protect_from_forgery except: :create

  def create
    render
  end
end

※たぶんCSRFトークンを事前に知らせるのは難易度高いので別の方法でセキュリティは担保する

▼app/views/articles/create.html.erb

<h1>Articles#create</h1>
<p>post and render html!!!!!</p>

※layoutとかは説明省略

curlしてみる

localhostで起動

$ bin/rails s

curlしてみる

$ curl -X POST localhost:3000/articles
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<HTML>
  <HEAD><TITLE>Length Required</TITLE></HEAD>
  <BODY>
    <H1>Length Required</H1>
    WEBrick::HTTPStatus::LengthRequired
    <HR>
    <ADDRESS>
     WEBrick/1.4.2 (Ruby/2.5.0/2017-12-25) at
     localhost:3000
    </ADDRESS>
  </BODY>
</HTML>

length-headerがないと怒られる、ので適当にパラメータをつける

$ curl -X POST localhost:3000/articles -d "example=test"
<!DOCTYPE html>
<html>
  <head>
    <title>SampleApp</title>
    <meta name="csrf-param" content="authenticity_token" />
<meta name="csrf-token" content="9gBv+fU3rLT7r57+yi6C/mZIGN8Pw4DNsdkdJTrrRwmxu4ftWOElOQGJIFg11hwwbaD8dH2wE5crqgFYpp2gew==" />


    <link rel="stylesheet" media="all" href="/stylesheets/application.css" />
  </head>

  <body>
    <h1>Articles#create</h1>
<p>post and render html!!!!!</p>

  </body>
</html>

取得できた。CSRFトークンもつく。

参考