20210410のRailsに関する記事は21件です。

【Railsサーバー】Address already in use - bind(2) for "127.0.0.1" port 8080 (Errno::EADDRINUSE)の対処方法

症状 RailsAPIモードとReactを使用中に、npmstartとRailsサーバーを起動しようとすると、Railsサーバーを起動したターミナルに下記のエラーメッセージが表示されてしまいました。 ターミナル rails s => Booting Puma => Rails 6.0.3.6 application starting in development => Run `rails server --help` for more startup options Puma starting in single mode... * Version 4.3.7 (ruby 2.6.3-p62), codename: Mysterious Traveller * Min threads: 5, max threads: 5 * Environment: development Exiting Traceback (most recent call last): 40: from bin/rails:3:in `<main>' 39: from bin/rails:3:in `load' 38: from /home/ubuntu/environment/プロジェクト名/bin/spring:15:in `<top (required)>' 37: from /home/ubuntu/environment/プロジェクト名/bin/spring:15:in `require' 36: from /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/spring-2.1.1/lib/spring/binstub.rb:11:in `<top (required)>' 35: from /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/spring-2.1.1/lib/spring/binstub.rb:11:in `load' 34: from /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/spring-2.1.1/bin/spring:49:in `<top (required)>' 33: from /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/spring-2.1.1/lib/spring/client.rb:30:in `run' 32: from /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/spring-2.1.1/lib/spring/client/command.rb:7:in `call' 31: from /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/spring-2.1.1/lib/spring/client/rails.rb:28:in `call' 30: from /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/spring-2.1.1/lib/spring/client/rails.rb:28:in `load' 29: from /home/ubuntu/environment/プロジェクト名/bin/rails:9:in `<top (required)>' 28: from /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/bootsnap-1.7.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:31:in `require' 27: from /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/bootsnap-1.7.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `require_with_bootsnap_lfi' 26: from /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/bootsnap-1.7.3/lib/bootsnap/load_path_cache/loaded_features_index.rb:92:in `register' 25: from /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/bootsnap-1.7.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `block in require_with_bootsnap_lfi' 24: from /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/bootsnap-1.7.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `require' 23: from /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/railties-6.0.3.6/lib/rails/commands.rb:18:in `<main>' 22: from /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/railties-6.0.3.6/lib/rails/command.rb:46:in `invoke' 21: from /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/railties-6.0.3.6/lib/rails/command/base.rb:69:in `perform' 20: from /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/thor-1.1.0/lib/thor.rb:392:in `dispatch' 19: from /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/thor-1.1.0/lib/thor/invocation.rb:127:in `invoke_command' 18: from /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/thor-1.1.0/lib/thor/command.rb:27:in `run' 17: from /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/railties-6.0.3.6/lib/rails/commands/server/server_command.rb:138:in `perform' 16: from /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/railties-6.0.3.6/lib/rails/commands/server/server_command.rb:138:in `tap' 15: from /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/railties-6.0.3.6/lib/rails/commands/server/server_command.rb:147:in `block in perform' 14: from /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/railties-6.0.3.6/lib/rails/commands/server/server_command.rb:39:in `start' 13: from /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/rack-2.2.3/lib/rack/server.rb:327:in `start' 12: from /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/puma-4.3.7/lib/rack/handler/puma.rb:73:in `run' 11: from /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/puma-4.3.7/lib/puma/launcher.rb:172:in `run' 10: from /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/puma-4.3.7/lib/puma/single.rb:98:in `run' 9: from /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/puma-4.3.7/lib/puma/runner.rb:161:in `load_and_bind' 8: from /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/puma-4.3.7/lib/puma/binder.rb:90:in `parse' 7: from /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/puma-4.3.7/lib/puma/binder.rb:90:in `each' 6: from /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/puma-4.3.7/lib/puma/binder.rb:106:in `block in parse' 5: from /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/puma-4.3.7/lib/puma/binder.rb:222:in `add_tcp_listener' 4: from /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/puma-4.3.7/lib/puma/binder.rb:222:in `each' 3: from /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/puma-4.3.7/lib/puma/binder.rb:223:in `block in add_tcp_listener' 2: from /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/puma-4.3.7/lib/puma/binder.rb:229:in `add_tcp_listener' 1: from /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/puma-4.3.7/lib/puma/binder.rb:229:in `new' /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/puma-4.3.7/lib/puma/binder.rb:229:in `initialize': Address already in use - bind(2) for "127.0.0.1" port 8080 (Errno::EADDRINUSE) 最後の行にあるエラーメッセージを翻訳すると「`initialize ':アドレスはすでに使用されています」でした。 解決方法 npmのほうでも、同様のポート番号を使っていたようです。 npmでは起動時にすでにポートを使用していると、違うポートを使うかを聞いてくるので、Railsサーバーを起動後にnpmstartを実施したら、エラーが表示されなくなりました。 rails側でポート番号を変更する方法についてはこちらに記載があったので、ご参考ください。 https://qiita.com/Tocyuki/items/de66987ead2183e4fcae 参考 rails sが立ち上がらない・・・ https://qiita.com/kamyu/items/1d39d4e57f04a3ad6b0c RailsでポートとIPアドレスを指定する方法 https://qiita.com/Tocyuki/items/de66987ead2183e4fcae
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

sendメソッドを調べてみた

はじめに railsで複数のカラムに、ある処理をして出力された値を入れたい場面で、sendメソッドが使用されていたので調べてました。 sendメソッドとは レシーバが持っているメソッドをして、呼び出すメソッド 構文 send(name, *args) name: メソッド名(文字列かシンボルで指定) args: メソッドに渡す引数 使用場面 条件別にメソッドを呼び出したい、カラムに値を入れたい時に使用する サンプルコード class Exam def japanese(score) puts "国語は#{score}点です" end def math(score) puts "数学は#{score}点です" end def english(score) puts "英語は#{score}点です" end end exam = Exam.new exam.send("japanese", 74) # => 国語は74点です exam.send(:math, 69) # => 数学は69点です exam.send(:english, 58) # => 英語は58点です *カラムに値を入れる場合、 send("カラム名=", 入れたい値) =を忘れないよう注意する必要がある。 # テーブル作成してある程で。 exam = Exam.new exam.send("japanese=", 74) exam.japanese => 74 おわりに 'はじめに'で話した使用場面では、 name: 複数カラムを配列に格納 args: あるメソッド通って出力された値 に当てはめ、each文を使用して、3行で該当するカラム全てに値を入れ直すことが出来ていたので便利に感じた。 参考記事 【Ruby on Rails】sendメソッドのいろんな書き方 Rubyのsendメソッドを使用するメリットと注意点 Object#send (Ruby 3.0.0 リファレンスマニュアル)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

テストは先に書くか後で書くか

Railsチュートリアルでは細かくテストを書かされます。 開発に慣れてくると最初にテストを書くらしい。 テストを書く手間はあるが、バグを追う時間が短縮されるので結果的に開発速度が上がるそうです。 ポートフォリオ用アプリケーションなどはテストなどの細部まで作り込むと時間効率が悪くなるので、後から必要な部分のテストを書いていくというやり方でもいいのではないかと考えてます(相対的に優先度が低いだけで重要なのは変わりない)。 テストを”先に書く”場合と”後で書く”場合の違いをまとめてみました。 先に書く ・アプリケーションのコードよりも明らかにテストコードの方が短くシンプルになる(=簡単に書ける) ・セキュリティが重要な課題またはセキュリティ周りのエラーが発生した場合 ・バグを見つけたら再現する。回帰バグを防ぐ体制を整えてから修正に取りかかる ・リファクタリングするとき。特に、エラーを起こしそうなコードや止まってしまいそうなコードを集中的にテストする 後で書く ・動作の仕様がまだ固まりきっていない場合、アプリケーションのコードを先に書き、期待する動作を書く。 ・すぐにまた変更しそうなコード(HTML構造の細部など) テスト駆動開発のサイクル 失敗するテストを最初に書く →アプリケーションのコードを書いて成功させる(パスさせる) →必要ならリファクタリングする
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rails6でlink_to....method: :deleteがNo route matches [GET]とエラーが出ます

Viewファイルの記述は以下 view/devise/registrations/new.html.erb <%= link_to 'ログアウト', destroy_user_session_path, method: :delete, class: "logout" %> エラーメッセージ画像 method: :deleteの記述もあるのに「GET」で読み込まれているようです。??? 引用 HARUPONdeさんの質問「投稿を削除したら、No route matches [GET] "/posts/1/destroy"がおきる」の解答にヒントがありました。ありがとうございました。 https://teratail.com/questions/256667 解答 link_toでGET以外のメソッドを投げるには、JavaScriptの力が必要です。 jquery-ujsあるいはrails-ujsといったJavaScriptライブラリは、読み込んでいますでしょうか。 JavaScriptの力とは Deviseを利用しているとたまに遭遇する問題で、原因は主にrails-ujsが読み込まれていないことのようです。 rails-ujsとは ちなみにujsとはrailsガイドによれば「Unobtrusive(控えめな)JavaScript」からUJSだそうです。 ※ひかめ目なとはrailsのコードとJavaScriptが正しくきちんと分離されていて「ぐいぐい食いこんで」きてJavaScriptがRailsコードに混ざっていないということを控えめと表現しているようです。  ujsはリンクの際のクリックイベントが発生時に発火してセキュリティトークンが組み込みヘルパーに自動的に含まれるようにします。セキュリティトークンがマッチしない場合には、RailsはGET以外のリクエストを受け付けなくなります。(きっと原因はこれ) 解決策1 私の場合、application.js(rails6.0)が全てコメントアウトだったので javascript/packs/application.js require("@rails/ujs").start() // require("turbolinks").start() // require("@rails/activestorage").start() // require("channels") コメントアウト外しました。 解決策2 link_toをbutton_toへ変更(リンク回避策) (誤) viewfile <%= link_to 'Delete', post, :method => :delete %> (正) rb:viewfile <%= button_to 'Delete', post, :method => :delete %> 解決策3 セキュリティー対策であるCSRF対策を部分解除 ※クロスサイトリクエストフォージェリ (CSRF)悪意のあるリンクやコードを仕込んでのサイト攻撃 destroyアクションを実施したいコントローラーに以下を追記する。 protect_from_forgery を使います。(詳細は調べてください) deleteを使用したいコントローラーからdestoryアクションを除外 item_controller protect_from_forgery :except => [:destroy] 参考 require("@rails/ujs").start( )について application.js内に記述があります。 (1)application.jsの場所の変更点    rails5.0→[プロジェクト]/app/assets/javascripts/application.js    rails6.0→[プロジェクト]/app/javascript/application.js (2)記述の仕方の変更点 rails5.0 //= require rails-ujs //= require turbolinks //= require_tree . rails6.0 require("@rails/ujs").start() require("turbolinks").start() require("@rails/activestorage").start() require("channels").
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

(Rails6)link_to....method: :delete設定してもNo route matches [GET]エラーが発生します

Viewファイルの記述は以下 view/devise/registrations/new.html.erb <%= link_to 'ログアウト', destroy_user_session_path, method: :delete, class: "logout" %> エラーメッセージ画像 method: :deleteの記述もあるのに「GET」で読み込まれているようです。??? 引用 HARUPONdeさんの質問「投稿を削除したら、No route matches [GET] "/posts/1/destroy"がおきる」の解答にヒントがありました。ありがとうございました。 https://teratail.com/questions/256667 引用サイトの解答 link_toでGET以外のメソッドを投げるには、JavaScriptの力が必要です。 jquery-ujsあるいはrails-ujsといったJavaScriptライブラリは、読み込んでいますでしょうか。 引用サイト解答内の「JavaScriptの力」とは Deviseを利用しているとたまに遭遇する問題で、原因は主にrails-ujsが読み込まれていないことのようです。 rails-ujsとは ujsとは   railsガイドによれば「Unobtrusive(控えめな)JavaScript」からUJSだそうです。 ※ひかめ目なとはrailsのコードとJavaScriptが正しくきちんと分離されていて「ぐいぐい食いこんで」きてJavaScriptがRailsコードに「混ざっていない」ということを「控えめ」と表現しているようです。 ujsの機能   ujsはリンククリック時に発火します。発火時セキュリティトークンという自サイトしか識別できない暗号を組み込みヘルパーに自動的に含まれるようにします。セキュリティトークンがマッチしない場合には、RailsはGET以外のリクエストを受け付けなくなります。(きっと原因はこれ) Get以外受け付けない理由   Railsがもつサイバー攻撃対策。名前はCross Site Request Forgeryといいます。外部サーバーから送信フォーム装ったリクエストを送るサイト攻撃に対する防御策です。決まったフォーム(付加されたセキュリティートークン)しか受け付けないように設定されています。この対策が「CSRF対策」だそうです。 *railsガイドを参照いたしました。 *「Ruby on Rails6超入門」秀和システム 掌田津邪乃著 参照①2.6 セッション固定攻撃 参照②はじめてのAjax 解決策1(私の場合) 私の場合、application.js(rails6.0)が全てコメントアウトだったので javascript/packs/application.js require("@rails/ujs").start() // require("turbolinks").start() // require("@rails/activestorage").start() // require("channels") 一部コメントアウトを外しました。 ⇨require("@rails/ujs").start()をコメントアウトを解除 解決策2 link_toをbutton_toへ変更(リンク回避策) (誤) viewfile <%= link_to 'Delete', post, :method => :delete %> (正) rb:viewfile <%= button_to 'Delete', post, :method => :delete %> 解決策3 セキュリティー対策であるCSRF対策を部分解除 ※クロスサイトリクエストフォージェリ (CSRF)悪意のあるリンクやコードを仕込んでのサイト攻撃 destroyアクションを実施したいコントローラーに以下を追記する。 protect_from_forgery を使います。 deleteを使用したいコントローラーからdestoryアクションを除外 (※今回はdevise_contollerなので編集できずに、こちらは無理でした) item_controller protect_from_forgery :except => [:destroy] 参考 require("@rails/ujs").start( )について application.js内に記述があります。 (1)application.jsの場所の変更点    rails5.0→[プロジェクト]/app/assets/javascripts/application.js    rails6.0→[プロジェクト]/app/javascript/packs/application.js (2)記述の仕方の変更点 rails5.0 //= require rails-ujs //= require turbolinks //= require_tree . rails6.0 require("@rails/ujs").start() require("turbolinks").start() require("@rails/activestorage").start() require("channels").
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Reactで子コンポーネントのフォームからCreateアクションを実行し、親コンポーネントのデータを更新する。[Rails使用]

これは何? Rails + React でSPAのアプリを作っています。途中、子コンポーネントから親コンポーネントにデータを渡す実装がありました。 復習もかね、やったことを記録にまとめます。なお、当方のReactの経験は3日前に初めて触った程度。また、実行環境は下記の通りです。 Rails 6.0.3 React 17.0.2 作ったもの 基本的なCRUD操作を行うアプリを作っています。Postsページ内にあるCreatePostFormコンポーネント内で、投稿を作成すると、Postsページに投稿が作成されます。 ▼画面イメージと親子関係はこんな感じ Railsの設定 まずはRails側でcreateアクションを実装し、必要なデータをJSON形式で出力できるようにします。 app/controllers/posts_controller.rb class PostsController < ApplicationController skip_before_action :verify_authenticity_token, only: %i[create] def index @posts = Post.all render json: @posts end def create post = Post.build(post_params) if post.save render json: post else lender json: post.errors end end private def post_params params.require(:label).permit(:name) end end 親コンポーネントを作成 次に、親コンポーネントであるPostsを記載していきます。今回はapp/javascript/pages/Posts.jsxというディレクトリ下に作成しました。 フォーム要素はPostCreateFormというコンポーネント内で作成して、まずは投稿の一覧表示の部分を作っていきます。 Posts.jsx import React, { useState } from 'react' import { PostCreateForm } from '~/components/PostCreateForm' import axios from 'axios' export const Posts = () => { // 解説します(★1) const [Posts, setPosts] = useState([]) // 解説します(★2) React.useEffect(async () => { const response = await axios.get('/posts'); // 解説します(★3) setPosts(response.data) }, []) return ( <div> <h1>投稿一覧</h1> <PostCreateForm /> // これが子コンポーネント <h3>作成した投稿</h3> <ul> {posts.map(post => ( <li key={post.id}> // 解説します(★4) {post.content} </li> ))} </ul> </div> ) } 関数コンポーネント まず★1 の部分の書き方を関数コンポーネントというようです。 公式のドキュメントのこちらのページで簡単に比較がしてありましたが、 コンポーネントと props Reactのコンポーネントがより簡潔に書ける書き方のようです。例えば、以下の2つのコードはReactでは同じものを表現しています。 // クラスコンポーネント class Content extends React.Component { constructor(props){ super(props) this.state = { content: '' } } render() { return <p>{this.props.content}</p>; } } // 関数コンポーネント export const Content = () => { const [content, setContent] = useState('') return ( return <p>{content}</p>; ) } ざっと調べた限りでは、これまで、stateやライフサイクルフックなどの主要機能がクラスコンポーネントでしか使えなかったため、クラスコンポーネントでの書き方が多かったようですが、 最近hookという機能が導入され、関数コンポーネントでも同様の書き方ができるようになったとのことでした。 関数コンポーネントでのステートの管理 そして、★2の部分が関数コンポーネントでステートを管理するときの書き方のようです。 const [Posts, setPosts] = useState([]) まず、useState([])の()内にあるのがstateの初期値です。なお、useState()メソッドは、同コンポーネントの情報に書いているように、 import React, { useState } from 'react' で関数を読み込んでこないと使えません。 そして、[Posts, setPosts]の部分ですが、これはステートの値(Posts)とそれを更新するための関数(setPosts)です。公式のAPIドキュメントが詳しかったです。 フック API リファレンス - 基本のフック このとき、Postsは最初に画面が読み込まれたとき画面に表示する初期値であり、画面が再描画されたときにはPostsの中身を表示します。 setPostsは以下のように新しい値を受け取って、新しい値を受け取って実行されることで、画面を再描画します。 setPosts(newPosts) 今回はここの部分で React.useEffect(async () => { const response = await axios.get('/posts'); setPosts(response.data) // ココ }, []) レスポンスとして帰ってきたデータを受け取って、画面を再描画していますね async と await ★3 をつけたこの部分。 React.useEffect(async () => { const response = await axios.get('/posts'); // 解説します(★3) setPosts(response.data) }, []) これはaxiosを使った新しい書き方のようです。 axios、async/awaitを使ったHTTPリクエスト(Web APIを実行) 残念ながら今の私にはJSの知識が不足していて、これ以上詳しくは書けないので、この記事のURLを貼付するに留めておきます。そのうち、知識がつけばしっかり復習したいです。 keyとmap 最後に、この★4をつけた部分。 {posts.map(post => ( <li key={post.id}> // ココ {post.content} </li> ))} Reactでも出てきましたね。これも公式のドキュメントの記載がわかりやすかったですが、要素を削除したときに、Reactがどの要素が削除されたのかわかりやすくするためにつける要素です。 keys 子コンポーネントにデータを渡す準備 さて、これで親コンポーネントで無事データを一覧表示することができました。このあと、親要素で定義したpostsを子要素に渡して、フォームで入力した値を一覧画面に表示していきますが、そのために親コンポーネントに少し工夫をします。 Posts.jsx <PostCreateForm posts={posts} setPosts={setPosts} /> ★2のところで、ステートを管理した[posts, setPosts]二つの関数を、それぞれpropsとして子コンポーネントに渡します。 子コンポーネントを作成 子コンポーネントPostCreateFormに書いたコードはこちらです。 PostCreateForm.jsx import React, { useState } from 'react' import axios from 'axios' export const PostCreateForm = (props) => { // 解説します★5 const [value, setValue] = useState('') const handleSubmit = (e) => { e.preventDefault(); if(value){ axios.post("/posts", { // 解説します★6 post: { content: value, } }) .then( response => { const newPosts = [...props.posts, response.data] // 解説します★7 props.setPosts(newPosts) setValue('') }) .catch( error => { console.log(error) }) } else { alert('内容を入力してください'); } } return ( <div> <form onSubmit={handleSubmit}> <input type="text" value={value} onChange={event => setValue(event.target.value)} /> <input type="submit" value="投稿" /> </form> </div> ) } 親のステートは子にpropsの形で渡す 公式チュートリアルを読む限り、Reactの使用上、子コンポーネントから親コンポーネントのstateを直接書き換えることはできないようです。 そのため、先程記載したように、親コンポーネントからpostsとsetPostsをそれぞれpropsとして子コンポーネントに渡し、 Posts.jsx <PostCreateForm posts={posts} setPosts={setPosts} /> 子コンポーネントでは、それをpropsとして受け取ります。★5 PostCreateForm.jsx export const PostCreateForm = (props) => { // ココ // 略 } axiosでpostデータを送る axiosでPOSTリクエストを送信するときは、第2引数で指定したデータがリクエストとして送信されるようです。 axios.post("/posts", { // ここから第二引数 post: { content: value, } }) axiosの使い方は、この記事がわかりやすかったです。 axiosの使い方まとめ (GET/POST/例外処理) そして、RailsではPOST以外のデータのやりとりにセキュリティートークンを付与して、それが一致しないとデータを送信できない仕組みになっています。 今回はRails外でPOSTリクエストを送信しようとしていますので、このままデータを送信すると、 Can't verify CSRF token authenticity. と出て、ステータスコード422が返ってきます。 本来は、ここでトークンを付与してエラーを解消すべきなのですが、今回は実装時間の関係上、セキュリティ認証を飛ばすというチートを行いました。。。(仕事で作るアプリでは、ちゃんと認証入れます。。。) /controllers/posts_controller.rb class PostsController < ApplicationController # 認証を飛ばすコード skip_before_action :verify_authenticity_token, only: %i[create] end 親要素のstateを更新する 最後に、リクエストが成功したときに、以下の方法で親要素のstateを更新します。 .then( response => { const newPosts = [...props.posts, response.data] // 解説します★7 props.setPosts(newPosts) setValue('') }) propsとして渡ってきた、親要素にあるstateを更新するための関数(setPosts)に新しい値newPostsをセットし、最後に、フォームを空にしています。 newPostsの中身である [...props.posts, response.data] の...の部分は、「スプレッド演算子」というらしく、配列や連想配列の要素をまるッと書きたいときに使う構文だそうです。 (以下のコードは、こちらの記事から引用させていただきました。とてもわかりやすかったです!) Reactにおけるスプレッド構文の使い所 // Array const odd = [1, 3] const even = [2, 4] const numbers = [...odd, ...even] console.log(numbers) // [1, 3, 2, 4] // Object const name = {first: "Tanaka", last: "Taro"} const age = {age: 27} const profile = {...name, ...age} console.log(profile) // {first: "Tanaka", last: "Taro", age: 27} 今はちょっとできる環境にないのですが、後ほど、...props.postsにどんなデータが入っているか確かめてみたいと思います。 完成! これで、Reactでデータを更新し、一覧表示するフォームができました! CRUDのCとRができたところになりますので、次回以降UとDも頑張ってみたいと思います。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

rails Basic 認証

初めに 初学者です。学習のためにアウトプットしています。間違いなどありましたらご指摘お願いします。 Basic認証 Basic認証とはHTTP通信の規格に備え付けられている、ユーザー認証の仕組みのことです。 サーバーとの通信が可能なユーザーとパスワードをあらかじめ設定しておき、それに一致したユーザーのみが利用できる認証システムです。 ページに遷移した時にこんな感じで出てきます。 railsアプリにBasic認証を導入する。 まずはauthenticate_or_request_with_http_basicメソッドを使用します。 こちらのメソッドはBasic認証を使うために利用するメソッドになります。全てのコントローラーに使用するためapplication_controller.rbに記述します。 class ApplicationController < ActionController::Base before_action :basic_auth private def basic_auth authenticate_or_request_with_http_basic do |username, password| username == 'hoge' && password == '1234' end end end これで設定完了です。ちなみにユーザーnameはhogeパスワードは1234です。 しかしこのままでは問題があります。コード上にBasicコードが記述されていることです。GitHub上に公開した場合、Basicコードのパスワードが誰にでも読める状態になっているからです。 その対策として環境変数を利用する必要があります。環境変数はzsh,またはbashの設定ファイルに記載します。 では軽く用語の説明をしていきます。 zsh zshとはログインシェルと呼ばれるものです。簡単に言えば隠しファイルみたいなものです。そしてプログラムの一番最初に対応します。 bash bashもログインシェルの1つです。違いはMacのosによってzshかbashを使うかの違いです。 vim vimとはサーバー上で使用できるテキストエディタのこと。vim コマンドを使うことで指定したファイルの編集をターミナルから行うことが可能になります。 環境変数の設定 私のMacではzshのためzshを使用していきます。 まずはターミナルに以下のコマンドを使用します。 % vim ~/.zshrc ~ ~ ~ ~ のように〜が縦並びでたくさん出てきます。 そのあとiキーを押してインサートモードに移行します。ターミナル左下にINSERTと出てきます。 そのあとにzah内に以下の記述をしていきます。 export BASIC_AUTH_USER='hoge' export BASIC_AUTH_PASSWORD='1234' 記述が終わったらescキーを使用して:wqと入力し、Enterキーを押します。 最後にsourceコマンドを実行します。 source ~/.zshrc このsouceコマンドとはシェルに記述された内容を実行する役割があります。 そしてapplication_controller.rbに環境変数を読み込む記述をすれば完成です。 def basic_auth authenticate_or_request_with_http_basic do |username, password| username == ENV["BASIC_AUTH_USER"] && password == ENV["BASIC_AUTH_PASSWORD"] # ここを変更 end end 最後にheroku上に環境変数を設定します。以下の記述を順番に記述します。 % heroku config:set BASIC_AUTH_USER="hoge" % heroku config:set BASIC_AUTH_PASSWORD="1234" 最後にherokuにpushして完成になります。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

No template for interactive requestの対処事例(ルーティングの基本大事)

基本がわかっていないことが発覚することなので書きます。 MVCを理解しておりませんでした。 ■エラー内容 テンプレートなしというエラーでした。 それまでに行ってきたこと ・[gem]devise導入       /bundle install/rails g devise install/rails g devise users/       /terminalでrails server実行/rails g devise views/       /rails db:migrate実行 ・application.controller.rb       /before_action :configure_permitted_parameters...記述       /devise_parameter_sanitizerメソッド記述 ・ログインview画面作成       /devises/registrationsフォルダにて⇨登録成功 ・indexファイル作成       /itemsフォルダ ・item_contorller作成 さてindexファイルもできたことだしサイトを表示させてみようと terminalでルーティングを行いました すると「users#index」とありました。 さっき設定したのはitemsフォルダのなか??? ここで気づいていればよかったのですが、 基本:自分が設定したものをルーティングは表示してれくれているだけなんです。 config/root.rb Rails.application.routes.draw do devise_for :users root "items#index" resources :users end resouses :usersと自分が書いたので users#index users#create users#new users#edit users#show users#update users#destroy の7つができていただけなんです。 config/root.rb Rails.application.routes.draw do devise_for :users root "items#index" end にするとエラーもでずlocalhost3000がきちんと表示されました。 ※ちなみに以下のルートは config/root.rb Rails.application.routes.draw do devise_for :users # root "items#index" # resources :users end deviseインストール時に自動追記された「devise_for :users」によるルーティングです。 参考までに
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

emptyの表記方法

どこで調べたかは忘れたけど empty?にはこういう表記方法もあるようだ <% if @items.empty?.! %> <% @items.each do |item| %> <li class='list'> <%= link_to item_path(item.id) do %> <div class='item-img-content'> <%= image_tag item.image, class: "item-img" %> emptyは文字列が空の時、真を返すが emptyの後ろに.!をつけると反対の意味になるようだ
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】fail to bundle install puma 4.3.5 ~~ でbundle installが落ちた話

bundle installでpumaのインストールに失敗して若干ハマったのでメモ 経緯と結果 bundle install 時に以下のエラーが発生 fail to bundle install puma 4.3.5 or gem puma with ruby-2.6.6 on macos-10.15.6 [duplicate] ↓のコマンドを実行後にbundle installしたらうまくいきました $ bundle config build.puma --with-cflags="-Wno-error=implicit-function-declaration" 原因とか良く分からんから少しもやもや・・? 詳しい人いたら教えてください〜 参考記事
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ransackについて

ransackについて、qiitaにはない便利な記事 ransack公式: https://github.com/activerecord-hackery/ransack ransacker公式: https://github.com/activerecord-hackery/ransack/wiki/Using-Ransackers Ransackで簡単に検索フォームを作る73のレシピ: http://nekorails.hatenablog.com/entry/2017/05/31/173925 Ransackで親テーブルや子テーブルのカラムで複数検索する方法: https://hi-algorithm.com/ransack-multiple-search/
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【21.04.09】DockerでRails x MySQLの環境構築

Docker公式リファレンス バージョン指定について RailsもRubyもMySQLも基本「これから開発するよ!」って時はその時の最新版を指定すればokです。 ・既存コードに関して改修をする ・保守する場合 時には、バージョンの変更はリスクなので、固定する方がよいらしいです。 ・DockerhubにあるMySQLのimageはこちら ・DockerhubにあるRubyのimageはこちら 私の環境 % sw_vers ProductName: Mac OS X ProductVersion: 10.15.7 BuildVersion: 19H524 まずは必要ファイルを作っていきます。 プロジェクトファイルを新規作成 & その下に移動 terminal. mkdir projectfile && cd projectfile 必須6ファイルを一気に新規作成 terminal. %touch {Dockerfile,docker-compose.yml,Gemfile,Gemfile.lock,entrypoint.sh,.env} Dockerfileの編集 ここまでできたらvimでDockerfileを開いて以下をコピペ % vi Dockerfileで開けます。 ※Dockerfile=Docker imageを作るための設計書 ※Dockerfileのコマンドについては公式リファレンスのこちらを参照してください。 dockerfile. FROM ruby:3.0.1 ENV LANG C.UTF-8 ENV APP_ROOT /app # install required libraries RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \ apt-get update -qq && \ apt-get install -y --no-install-recommends \ build-essential \ nodejs \ yarn && \ apt-get clean && \ rm --recursive --force /var/lib/apt/lists/* # create working directory RUN mkdir $APP_ROOT WORKDIR $APP_ROOT # bundle install COPY Gemfile $APP_ROOT/Gemfile COPY Gemfile.lock $APP_ROOT/Gemfile.lock RUN bundle install --jobs 4 --retry 3 # create app in container COPY . $APP_ROOT # script to be executed every time the container starts COPY entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] EXPOSE 3000 # Start the main process CMD ["rails", "server", "-b", "0.0.0.0"] ・curlコマンド=サーバから、もしくはサーバへデータ転送を行うコマンド docker-compose.ymlの編集 docker-compose.yml version: '3.7' services: db: image: mysql:8.0.20 volumes: - mysql:/var/lib/mysql:delegated ports: - '3307:3306' command: --default-authentication-plugin=mysql_native_password env_file: .env web: build: context: . dockerfile: Dockerfile command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" tty: true stdin_open: true env_file: .env depends_on: - db ports: - '3000:3000' volumes: - .:/app:cached - bundle:/usr/local/bundle:delegated - node_modules:/app/node_modules - tmp-data:/app/tmp/sockets volumes: mysql: bundle: node_modules: tmp-data: Gemfileの編集 Gemfile. source 'https://rubygems.org' gem 'rails', '6.1.3.1' 少なって感じだけど、 source 'https://rubygems.org'で大体必要なgem達は引っ張ってきてくれるみたいなので大丈夫。     .envファイルの編集 env. MYSQL_ROOT_PASSWORD=password TZ=Japan entrypoint.shの編集 entrypoint.sh #!/bin/bash set -e # Remove a potentially pre-existing server.pid for Rails. rm -f /myapp/tmp/pids/server.pid # Then exec the container's main process (what's set as CMD in the Dockerfile). exec "$@"       参考記事 【Dockerで環境構築】Rails 6 & MySQL 8   
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【21.04.09】DockerでRails6 x MySQL8の環境構築

Docker公式リファレンス バージョン指定について RailsもRubyもMySQLも基本「これから開発するよ!」って時はその時の最新版を指定すればokです。 ・既存コードに関して改修をする ・保守する場合 時には、バージョンの変更はリスクなので、固定する方がよいらしいです。 ・DockerhubにあるMySQLのimageはこちら ・DockerhubにあるRubyのimageはこちら 私の環境 % sw_vers ProductName: Mac OS X ProductVersion: 10.15.7 BuildVersion: 19H524 作業の流れ STEP1. 各種ファイルの用意 STEP2. rails new でアプリ作成 STEP3. イメージのビルド STEP4. database.yml の設定と DB 接続 STEP5. コンテナ起動 STEP1. まずは必要ファイルを作っていきます。 プロジェクトファイルを新規作成 & その下に移動 terminal. mkdir projectfile && cd projectfile 必須6ファイルを一気に新規作成 terminal. %touch {Dockerfile,docker-compose.yml,Gemfile,Gemfile.lock,entrypoint.sh,.env} ※ここでターミナルで%lsで見てみても、.envファイルが見当たらないと思いますが、ちゃんと作られてるのでご安心を。 Dockerfileの編集 ここまでできたらvimでDockerfileを開いて以下をコピペ % vi Dockerfileで開けます。 ※Dockerfile=Docker imageを作るための設計書 ※Dockerfileのコマンドについては公式リファレンスのこちらを参照してください。 dockerfile. FROM ruby:3.0.1 ENV LANG C.UTF-8 ENV APP_ROOT /app # install required libraries RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \ apt-get update -qq && \ apt-get install -y --no-install-recommends \ build-essential \ nodejs \ yarn && \ apt-get clean && \ rm --recursive --force /var/lib/apt/lists/* # create working directory RUN mkdir $APP_ROOT WORKDIR $APP_ROOT # bundle install COPY Gemfile $APP_ROOT/Gemfile COPY Gemfile.lock $APP_ROOT/Gemfile.lock RUN bundle install --jobs 4 --retry 3 # create app in container COPY . $APP_ROOT # script to be executed every time the container starts COPY entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] EXPOSE 3000 # Start the main process CMD ["rails", "server", "-b", "0.0.0.0"] ・curlコマンド=サーバから、もしくはサーバへデータ転送を行うコマンド docker-compose.ymlの編集 docker-compose.yml version: '3.7' services: db: image: mysql:8.0.20 volumes: - mysql:/var/lib/mysql:delegated ports: - '3307:3306' command: --default-authentication-plugin=mysql_native_password env_file: .env web: build: context: . dockerfile: Dockerfile command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" tty: true stdin_open: true env_file: .env depends_on: - db ports: - '3000:3000' volumes: - .:/app:cached - bundle:/usr/local/bundle:delegated - node_modules:/app/node_modules - tmp-data:/app/tmp/sockets volumes: mysql: bundle: node_modules: tmp-data: Gemfileの編集 Gemfile. source 'https://rubygems.org' gem 'rails', '6.1.3.1' 少なって感じだけど、 source 'https://rubygems.org'で大体必要なgem達は引っ張ってきてくれるみたいなので大丈夫。     .envファイルの編集 .envファイル=秘密鍵などを隠しておくためのファイルです。 env. MYSQL_ROOT_PASSWORD=password TZ=Japan entrypoint.shの編集 普通にdockerを立てると、pidsファイルになんらかの数字が書き込まれてしまってエラーの原因(この記事みたいな)になります。 なので、それを事前に防いでおくためのコードをこのentrypoint.shに記述しておきます。 entrypoint.sh #!/bin/bash set -e # Remove a potentially pre-existing server.pid for Rails. rm -f /myapp/tmp/pids/server.pid # Then exec the container's main process (what's set as CMD in the Dockerfile). exec "$@"    STEP2. Docker上でrails new terminal. docker-compose run --rm web rails new . --force --no-deps --database=mysql --skip-turbolinks --skip-test docker-compose run --rm web bin/rails webpacker:install (↑のコマンドdocker-compose run --rm web rails new . --force --no-deps --database=mysql --skip-turbolinks --skip-test --webpackerだけでできる気がする) たくさんファイルができました! terminal. % ls Dockerfile config package.json Gemfile config.ru postcss.config.js Gemfile.lock db public README.md docker-compose.yml storage Rakefile entrypoint.sh tmp app lib vendor babel.config.js log yarn.lock bin node_modules STEP3. config/database.ymlを編集 config/database.yml default: &default adapter: mysql2 encoding: utf8mb4 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: <%= ENV.fetch('MYSQL_USERNAME') { 'root' } %> password: <%= ENV.fetch('MYSQL_PASSWORD') { 'password' } %> host: <%= ENV.fetch('MYSQL_HOST') { 'db' } %> development: <<: *default database: rails_app_dev test: <<: *default database: rails_app_test production: <<: *default database: rails_app_prd username: app password: hoge   Dockerイメージをビルドし、DB作成 docker-compose build docker-compose run web bin/rails db:create コンテナを起動 docker-compose up -d Your're on Rails!が出たら成功! 補足 docker上でRails開発をする時のコマンドたち terminal. $ docker-compose run web bundle exec rails コマンド モデルの作成 terminal. docker-compose run web bundle exec rails g model User コントローラの作成 terminal. docker-compose run web bundle exec rails g controller Homepages index terminal. docker-compose run web bundle exec rails g rspec:install Docker上でMySQLに接続する方法 参考記事: 【Docker×MySQL】Docker環境下でMySQLコンテナに接続する方法(テーブル情報を確認) docker psでdbコンテナの名前を確認。(※以下の場合は、上から2つめのコンテナのproject_file_db_1が名前) % docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7de3cc82f8db project_file_web "entrypoint.sh bash …" 14 minutes ago Up 14 minutes 0.0.0.0:3000->3000/tcp project_file_web_1 026f77ef5f58 mysql:8.0.20 "docker-entrypoint.s…" 2 hours ago Up 2 hours 33060/tcp, 0.0.0.0:3307->3306/tcp project_file_db_1 以下のコマンドでMySQLコンテナに接続(project_file_db_1の所は各自のDBコンテナ名にしてください) 前述した % docker exec -it project_file_db_1 bash root@026f77ef5f58:/# 接続できたらMySQLにアクセス。 root@026f77ef5f58:/#mysql -u root -p Enter password: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) root@026f77ef5f58:/# 参考記事 【Dockerで環境構築】Rails 6 & MySQL 8 【Rails】Rails 6.0 x Docker x MySQLで環境構築
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【21.04.09】DockerでRails6 x MySQL8で開発環境を構築する

Docker公式リファレンス バージョン指定について RailsもRubyもMySQLも基本「これから開発するよ!」って時はその時の最新版を指定すればokです。 ・既存コードに関して改修をする ・保守する場合 時には、バージョンの変更はリスクなので、固定する方がよいらしいです。 ・DockerhubにあるMySQLのimageはこちら ・DockerhubにあるRubyのimageはこちら 私の環境 % sw_vers ProductName: Mac OS X ProductVersion: 10.15.7 BuildVersion: 19H524 作業の流れ STEP1. 各種ファイルの用意 STEP2. rails new でアプリ作成 STEP3. イメージのビルド STEP4. database.yml の設定と DB 接続 STEP5. コンテナ起動 STEP1. まずは必要ファイルを作っていきます。 プロジェクトファイルを新規作成 & その下に移動 terminal. mkdir projectfile && cd projectfile 必須6ファイルを一気に新規作成 terminal. %touch {Dockerfile,docker-compose.yml,Gemfile,Gemfile.lock,entrypoint.sh,.env} ※ここでターミナルで%lsで見てみても、.envファイルが見当たらないと思いますが、ちゃんと作られてるのでご安心を。 Dockerfileの編集 ここまでできたらvimでDockerfileを開いて以下をコピペ % vi Dockerfileで開けます。 ※Dockerfile=Docker imageを作るための設計書 ※Dockerfileのコマンドについては公式リファレンスのこちらを参照してください。 dockerfile. FROM ruby:3.0.1 ENV LANG C.UTF-8 ENV APP_ROOT /app # install required libraries RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \ apt-get update -qq && \ apt-get install -y --no-install-recommends \ build-essential \ nodejs \ yarn && \ apt-get clean && \ rm --recursive --force /var/lib/apt/lists/* # create working directory RUN mkdir $APP_ROOT WORKDIR $APP_ROOT # bundle install COPY Gemfile $APP_ROOT/Gemfile COPY Gemfile.lock $APP_ROOT/Gemfile.lock RUN bundle install --jobs 4 --retry 3 # create app in container COPY . $APP_ROOT # script to be executed every time the container starts COPY entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] EXPOSE 3000 # Start the main process CMD ["rails", "server", "-b", "0.0.0.0"] ・curlコマンド=サーバから、もしくはサーバへデータ転送を行うコマンド docker-compose.ymlの編集 docker-compose.yml version: '3.7' services: db: image: mysql:8.0.20 volumes: - mysql:/var/lib/mysql:delegated ports: - '3307:3306' command: --default-authentication-plugin=mysql_native_password env_file: .env web: build: context: . dockerfile: Dockerfile command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" tty: true stdin_open: true env_file: .env depends_on: - db ports: - '3000:3000' volumes: - .:/app:cached - bundle:/usr/local/bundle:delegated - node_modules:/app/node_modules - tmp-data:/app/tmp/sockets volumes: mysql: bundle: node_modules: tmp-data: Gemfileの編集 Gemfile. source 'https://rubygems.org' gem 'rails', '6.1.3.1' 少なって感じだけど、 source 'https://rubygems.org'で大体必要なgem達は引っ張ってきてくれるみたいなので大丈夫。     .envファイルの編集 .envファイル=秘密鍵などを隠しておくためのファイルです。 env. MYSQL_ROOT_PASSWORD=password TZ=Japan entrypoint.shの編集 普通にdockerを立てると、pidsファイルになんらかの数字が書き込まれてしまってエラーの原因(この記事みたいな)になります。 なので、それを事前に防いでおくためのコードをこのentrypoint.shに記述しておきます。 entrypoint.sh #!/bin/bash set -e # Remove a potentially pre-existing server.pid for Rails. rm -f /myapp/tmp/pids/server.pid # Then exec the container's main process (what's set as CMD in the Dockerfile). exec "$@"    STEP2. Docker上でrails new terminal. docker-compose run --rm web rails new . --force --no-deps --database=mysql --skip-turbolinks --skip-test docker-compose run --rm web bin/rails webpacker:install (↑のコマンドdocker-compose run --rm web rails new . --force --no-deps --database=mysql --skip-turbolinks --skip-test --webpackerだけでできる気がする) たくさんファイルができました! terminal. % ls Dockerfile config package.json Gemfile config.ru postcss.config.js Gemfile.lock db public README.md docker-compose.yml storage Rakefile entrypoint.sh tmp app lib vendor babel.config.js log yarn.lock bin node_modules STEP3. config/database.ymlを編集 ↓のpasswordなどは任意で登録。 config/database.yml default: &default adapter: mysql2 encoding: utf8mb4 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: <%= ENV.fetch('MYSQL_USERNAME') { 'root' } %> password: <%= ENV.fetch('MYSQL_PASSWORD') { 'password' } %> host: <%= ENV.fetch('MYSQL_HOST') { 'db' } %> development: <<: *default database: rails_app_dev test: <<: *default database: rails_app_test production: <<: *default database: rails_app_prd username: app password: hoge ↑ここでusernameをappじゃなく、サービス名にしておくと吉。 Dockerイメージをビルドし、DB作成 docker-compose build docker-compose run web bin/rails db:create コンテナを起動 docker-compose up -d Your're on Rails!が出たら成功! 補足 docker上でRails開発をする時のコマンドたち terminal. $ docker-compose run web bundle exec rails コマンド モデルの作成 terminal. docker-compose run web bundle exec rails g model User コントローラの作成 terminal. docker-compose run web bundle exec rails g controller Homepages index terminal. docker-compose run web bundle exec rails g rspec:install Docker上でMySQLに接続する方法 参考記事: 【Docker×MySQL】Docker環境下でMySQLコンテナに接続する方法(テーブル情報を確認) docker psでdbコンテナの名前を確認。(※以下の場合は、上から2つめのコンテナのproject_file_db_1が名前) % docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7de3cc82f8db project_file_web "entrypoint.sh bash …" 14 minutes ago Up 14 minutes 0.0.0.0:3000->3000/tcp project_file_web_1 026f77ef5f58 mysql:8.0.20 "docker-entrypoint.s…" 2 hours ago Up 2 hours 33060/tcp, 0.0.0.0:3307->3306/tcp project_file_db_1 以下のコマンドでMySQLコンテナに接続(project_file_db_1の所は各自のDBコンテナ名にしてください) 前述した % docker exec -it project_file_db_1 bash root@026f77ef5f58:/# 接続できたらMySQLにアクセス。 root@026f77ef5f58:/#mysql -u root -p Enter password: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) root@026f77ef5f58:/# 参考記事 【Dockerで環境構築】Rails 6 & MySQL 8 【Rails】Rails 6.0 x Docker x MySQLで環境構築
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

nested formについて

qiita以外の役立つ記事 cocoon公式: https://github.com/nathanvda/cocoon 子から親の作成 https://donghai821.hatenadiary.org/entry/20110804/1312475967
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

プログラミングしてて調べた英単語集(随時更新)

Webアプリケーションを開発してて調べた英単語たちをメモ的にあげていきます。 単語がWEB用語であるかどうかは関係なしにあげていきます。 単語力の低さは目をつぶってください。。 A aim 意図する。狙う。 出てきたとこ RubocopのDocument B C clause 句。条項。項。 出てきたとこ Ruby(Rubocopに"Use a guard clause"って怒られた) guard clause: 「ガード節」「ガード条件」「ガード構文」 参考: [Ruby/Rails] 例外で深くなったネストをGuard Clauseですっきりさせる concatenation 連結、連なり 出てきたとこ Rubocop configure 構成、設定 出てきたとこ あちこち。 .conf とか config はこの子の略。 conservative 保守的 出てきたとこ RubocopのDocument context 環境。文脈 出てきたとこ Rspec D describe 説明する 出てきたとこ Rspec E ease 簡易。楽。 出てきたとこ RubocopのDocument enumerate 列挙する 出てきたとこ git pushの結果 extention 拡張 出てきたとこ RubocopのDocument extract 引き抜く 出てきたとこ RubocopのDocument F G H I implement 実装する 出てきたとこ Rspec interpolation 書き入れ、改ざん、補間 出てきたとこ Rubocop J K L M miscellaneous その他。雑多な。 出てきたとこ Railsチュートリアル N O P parser 構文解析を行うためのプログラム 出てきたとこ Rubocop prevent 防ぐ 出てきたとこ RubocopのDocument Q R reserve 予約する。留保する。取っておく。 出てきたとこ RubocopのDocument S stable 安定している 出てきたとこ RubocopのDocument T trait 特性 出てきたとこ Rspec U V W X Y Z
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails6】初心者が見様見真似でDockerとCircleCIを既存Railsアプリに導入した結果…

アプリの環境 rails6.0.3.6 ruby2.6.5 bundler2.1.4 mysql5.6 最初に…僕なりのイメージ 実装してみた感じこういうイメージで捉えておくと良さそう Docker関係 Dockerfile…仮想コンテナの環境構築をするファイル。 docker componse build するとここに書いてあるコマンドが実行される。 docker-compose.yml…仮想コンテナで使用するDBなど詳細設定を行うファイル。 docker compose up をするとここに書いてある内容を元にアプリが立ち上がる entrypoint.sh…仮想環境を立ち上げる際に最初に読み込まれる内容を決めるファイル CircleCI関係 config.yml…Githubへのpushが行われた際にここに書いてある内容が順に実行される。手順書的な感じ。雰囲気だけはDockerfileに近い 【Docker編】やったこと https://qiita.com/Tomohisa_koyama/items/5f2d32fd0677aa244b72 こちらにruby, rails, mysqlともに同じバージョンのものを発見しましたのでこれを参考にしました。 FROM ruby:2.6.5 RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \ && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs yarn RUN mkdir /myapp WORKDIR /myapp COPY Gemfile /myapp/Gemfile COPY Gemfile.lock /myapp/Gemfile.lock RUN gem install bundler # これがないとbundlerがないって言われる RUN bundle install COPY . /myapp COPY entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] EXPOSE 3000 CMD ["rails", "server", "-b", "0.0.0.0"] 参考サイトとの違いは gem install bundler を実行しているか否か。これは以下サイトを参考にしました。 https://qiita.com/kenz-dev/items/e3d970b59bf106cab19e docker-compose.yml 参考サイト通りです。 version: "3" services: db: image: mysql:5.6.47 env_file: database.env ports: - "3306:3306" volumes: - ./db/mysql/volumes:/var/lib/mysql web: env_file: web.env build: . command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" stdin_open: true tty: true volumes: - .:/myapp - gem_data:/usr/local/bundle ports: - "3000:3000" depends_on: - db volumes: mysql_data: gem_data: 【追記】 環境変数が読み込めなくてエラーが起こったので以下サイトを参考に外部ファイルから読み込めるよう設定しました。 https://qiita.com/KEINOS/items/518610bc2fdf5999acf2 mysql周りで必要な設定 以下を参考にやりました。 https://qiita.com/nanakenashi/items/180941699dc7ba9d0922 気をつけるべきはMYSQL_ROOT_PASSWORDが必須であることでしょう。 ローカルではパスワードなしでもrootユーザー動かせますがdockerの場合はpasswordなしだと docker-compose upのときにエラーが出ます。 entrypoint.sh 参考サイト通り #!/bin/bash set -e # Remove a potentially pre-existing server.pid for Rails. rm -f /myapp/tmp/pids/server.pid # Then exec the container's main process (what's set as CMD in the Dockerfile). exec "$@" この時点で docker compose build docker compose up をすると仮想環境が立ち上がるはずです。 【CircleCI編】やったこと CircleCIはちょっと複雑でした。 どうやら事前にcommandオプションで実行する内容を定義してからstepsを書く、というのもあるみたいですね?? https://qiita.com/AK4747471/items/b2161784065f21cd1645 こちらのサイトがconfig.ymlの記述自体は理解しやすかったのでこれを基準にカスタマイズしました。 config.yml version: 2.1 orbs: slack: circleci/slack@4.3.0 jobs: build: docker: - image: circleci/ruby:2.6.5-node-browsers environment: - BUNDLER_VERSION: 2.1.4 - RAILS_ENV: 'test' - image: circleci/mysql:5.6 environment: - MYSQL_ALLOW_EMPTY_PASSWORD: 'true' - MYSQL_ROOT_HOST: '127.0.0.1' working_directory: ~/sample_app steps: - checkout - restore_cache: keys: - v1-dependencies-{{ checksum "Gemfile.lock" }} - v1-dependencies- - run: name: install dependencies command: | gem install bundler -v 2.1.4 bundle install --jobs=4 --retry=3 --path vendor/bundle - save_cache: paths: - ./vendor/bundle key: v1-dependencies-{{ checksum "Gemfile.lock" }} # database setup - run: mv ./config/database.yml.ci ./config/database.yml # database setup - run: name: setup database command: | bundle exec rake db:create bundle exec rake db:schema:load # install yarn - run: name: install yarn command: yarn install #run rubocop - run: name: Rubocop command: | bundle exec rubocop -a bundle exec rubocop -A # run tests - run: name: run rspec command: bundle exec rspec # collect reports - store_test_results: path: /tmp/test-results - store_artifacts: path: /tmp/test-results destination: test-results - slack/notify: event: fail mentions: '@ユーザー名' template: basic_fail_1 - slack/notify: event: pass mentions: '@ユーザー名' template: basic_success_1 このymlファイルを使うと以下を実行できます。 自動コード整形(rubocop) 自動テスト(rspec) Slackへの通知 苦労した点 特段難しい箇所はなかったですが、CircleCIからSlackへの通知がなかなか飛ばなくて苦戦しました。 Slackへの通知は以下URLから公式の情報を元にやりましょう。というのも昨年あたりにSlackとCircleCIの連携方法が変更になったこともあり、 古い情報を載せているブログなどもあるためです。簡単に言うと、Webhookを使った連携が昔のやり方で、今はOAuthを使って連携しているようです。 SlackAppでcircleciと検索すると公式のアプリが出てきますが、それはもう使われていない?ようです。 細かいカスタマイズとかは以下URLが詳しいです。最初はとりあえずtemplateでいいと思いますが、jobsが失敗したときだけ通知したいとかそういう場合は別途設定が必要なので徐々にカスタマイズしていきましょう。 あとは、環境変数の設定が必要になるのですがどこからやるのか記載がなくちょっと探しました。 Project Setting→Environment Variablesと進むと環境変数をまとめて設定できます。Rspec実行時に必要な環境変数もここで設定しましょう。 最後に 初めてのCI導入でしたがいざ導入してみると非常に便利で感動しました。もっと早くしっておけばよかったです。 特に感動したポイントは 毎回rubocopとテストの実行を自動でやってくれるのでコードの管理の手間が省ける rubocopとテストの実行を抜けもれなくやってくれるのであとになってやり直しをしなくて済む Circle CIが頑張ってくれている間に他の作業ができる といったあたりです。チームで開発しているとコードレビューの手間も省けそうですよね! 以上、参考になれば幸いです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【個人開発】制限のない自由なSNS作ってみた!

初めに この度Ammotというwebアプリを開発しました。 コンセプトは「制限の少ない自由な投稿を」です。 「ツイッターは文字数制限がきつい、ただfacebookは実名制だしデザインがごちゃごちゃでいや」 という声を聴いたので作ってみました。 先に行っておくと Ammotは文字数制限が6000字まで、画像・動画・PDF・音声は同時に10個まで投稿可能です。 概要 ↑ログイン前のトップページにはフィットスクロール(名前間違いかも)を使用して新しいおしゃれなサイト感を出してます。 ↑これがログイン後のトップです。フォローしたユーザーの投稿がHOMEに流れて、 サイドバーにはおすすめの投稿と現在人気のタグを表示しています。 ↑ポップアップの投稿画面です。 ツイッターのいやなとこ 文字数制限 編集ができない(個人的にめちゃ嫌) facebookのいやなとこ 制限はないがデザインがぐちゃぐちゃ 実名制はなんかいやだ この二つSNSの問題を解決するのがAmmotです。 工夫した点 無料プランにこだわった こういうものはバズらない限り、すぐには成功しません。使用者が全くいなくても1年は公開しようと思います。 でも使用者がいないのに月数百円も取られるの馬鹿馬鹿しいじゃないですか。だからドメイン以外はすべて無料です。 ただherokuの無料プランだとドメインを設定できないのでCloudflareを使い設定しました。 参考記事: デザインとUIにこだわった(つもり) フィットスクロール?だったり投稿画面のポップアップだったり 今まで使ってこなかった手法を使ってみました。 自己満になってるかもしれない ちなみにデザインを参考にしたサイトはtumblrです。 比べればまぁまぁ似てると思います。 機能性 最初にも書きましたが画像・動画・PDF・音声の投稿とプレビュー機能を実装しました。 これにはいろんな記事がありましたが まともに動きかつ一番簡単でコードもシンプルなこの記事を参考にするのをお勧めします。 使用した技術 rails6 ruby2.7 postgresql heroku free aws s3 gem 'ridgepole' gem 'slim-rails' gem 'html2slim' gem 'pry-rails' gem 'devise' gem 'kaminari' gem 'activeadmin' gem 'rack-attack' gem 'rails-i18n' gem 'devise-i18n' gem 'devise-i18n-views' gem 'carrierwave' gem 'rmagick' gem 'rinku' gem 'fog-aws' gem 'dotenv-rails' #一部抜いてます まとめ 今回の開発は今までやらなかったことにめちゃ挑戦できたので楽しかったです 苦手なjquery・javascriptもプレビュー機能のおかげでちょっとわかった気がしてます。 文字数制限や実名制で不便を感じたことのある人はぜひAmmot使ってください!お願いします。 ↓URL https://ammot.net/ ↓僕のAmmotのアカウント https://ammot.net/user/yamada ↓僕のツイッターのアカウント https://twitter.com/yamada1531
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

制限の少ない自由なSNS

初めに この度Ammotというwebアプリを開発しました。 コンセプトは「制限の少ない自由な投稿を」です。 「ツイッターは文字数制限がきつい、ただfacebookは実名制だしデザインがごちゃごちゃでいや」 という声を聴いたので作ってみました。 先に行っておくと Ammotは文字数制限が6000字まで、画像・動画・PDF・音声は同時に10個まで投稿可能です。 概要 ↑ログイン前のトップページにはフィットスクロール(名前間違いかも)を使用して新しいおしゃれなサイト感を出してます。 ↑これがログイン後のトップです。フォローしたユーザーの投稿がHOMEに流れて、 サイドバーにはおすすめの投稿と現在人気のタグを表示しています。 ↑ポップアップの投稿画面です。 ツイッターのいやなとこ 文字数制限 編集ができない(個人的にめちゃ嫌) facebookのいやなとこ 制限はないがデザインがぐちゃぐちゃ 実名制はなんかいやだ この二つSNSの問題を解決するのがAmmotです。 工夫した点 無料プランにこだわった こういうものはバズらない限り、すぐには成功しません。使用者が全くいなくても1年は公開しようと思います。 でも使用者がいないのに月数百円も取られるの馬鹿馬鹿しいじゃないですか。だからドメイン以外はすべて無料です。 ただherokuの無料プランだとドメインを設定できないのでCloudflareを使い設定しました。 参考記事: デザインとUIにこだわった(つもり) フィットスクロール?だったり投稿画面のポップアップだったり 今まで使ってこなかった手法を使ってみました。 自己満になってるかもしれない ちなみにデザインを参考にしたサイトはtumblrです。 比べればまぁまぁ似てると思います。 機能性 最初にも書きましたが画像・動画・PDF・音声の投稿とプレビュー機能を実装しました。 これにはいろんな記事がありましたが まともに動きかつ一番簡単でコードもシンプルなこの記事を参考にするのをお勧めします。 使用した技術 rails6 ruby2.7 postgresql heroku free aws s3 gem 'ridgepole' gem 'slim-rails' gem 'html2slim' gem 'pry-rails' gem 'devise' gem 'kaminari' gem 'activeadmin' gem 'rack-attack' gem 'rails-i18n' gem 'devise-i18n' gem 'devise-i18n-views' gem 'carrierwave' gem 'rmagick' gem 'rinku' gem 'fog-aws' gem 'dotenv-rails' #一部抜いてます まとめ 今回の開発は今までやらなかったことにめちゃ挑戦できたので楽しかったです 苦手なjquery・javascriptもプレビュー機能のおかげでちょっとわかった気がしてます。 文字数制限や実名制で不便を感じたことのある人はぜひAmmot使ってください!お願いします。 ↓URL https://ammot.net/ ↓僕のAmmotのアカウント https://ammot.net/user/yamada ↓僕のツイッターのアカウント https://twitter.com/yamada1531
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

rails-serverが起動できない問題

rails-tutorialでrails-serverが起動できない問題についてずっと悩まされていました。 原因 毎回PCをシャットダウンした後、サーバーが起動できなくなっていました。 今回はAWSで30分でタイムアウトした後サーバーが起動できなくなりました。 解決方法 AWS再起動時、ターミナル上でhello_appではなくenvironmentになってしまっていたのが原因でした。 cdすればよかっただけの問題でした。 検索力の大事さを実感できました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

deviseを使用したログイン機能実装での注意事項

フリマアプリのログイン機能実装の際にターミナルに現れたエラーの解消方法です。 deviseを入れてログイン機能を実装中にターミナルに以下のエラーを発見しました。 1。赤いいつものエラー画面にはなりませんでした。 2。データーベースに記録されずに新規登録画面に戻ります。 3。ターミナルのエラーは以下です。 terminal =>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "first_name"=>"前田", "last_name"=>"卓大", "first_name_prono"=>"マエダ", "last_name_prono"=>"タクオ", "birthday(1i)"=>"1930", "birthday(2i)"=>"1", "birthday(3i)"=>"1"}, "commit"=>"会員登録"} Unpermitted parameter: :encrypted_password (0.2ms) BEGIN User Exists? (0.3ms) SELECT 1 AS one FROM `users` WHERE `users`.`email` = BINARY 'sample@aaaaaa' LIMIT 1 (0.1ms) ROLLBACK 着目点 1点目:Unpermitted(許可されていない) parameter: :encrypted_password 許可されていないパスワードとは??? 2点目:メールの後でロールバック(rollback)??? ここで @magatama さん「deviseで登録できない疑うところ6点」を参照しました (大変勉強になりました) https://qiita.com/magatama/items/c5705e45ce8d60f925ff deviseを用いてログイン機能を実装した場合いは ❶view views/registrations/new.html.erb <%= f.password_field :password, class:"input-default",...... %> ①passwordをviewファイルに入力 ❷usersテーブル ②encrypted_passwordをカラム名にする 以下はdeviseに実装内容になります。 1.viewでpasswordとpassword_confimationが同じかチェック 2.(同じならば)view受け取ったpasswordをdevise_controllerで'encryped_password'に暗号化した文字列を返す 実際に暗号化されてデータベースに入ったpasswordは以下です。 $2a$12$DH1OsQXerMUhOzVxW6T/Z.xnjabsf8unyo6OeeMZhOgWy57mexsJm 私の間違いはviewファイル内でencrypted_password入力としていた点です。 passwordにするとうまくいきました
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む