Rails関連のことを調べてみた2020年05月17日

Rails関連のことを調べてみた2020年05月17日

【Rails Tutorial 機能拡張】REST API を追加してみた

こんにちは。業務でRuby / Rails によるバックエンドエンジニアをしています。
業務経歴が半年立ったので、改めて幅広くRailsについて知りたいと思いRails Tutorial を完遂しました。

最後の「14.4.1 サンプルアプリケーションの機能を拡張する」の項の[REST API](https://railstutorial.jp/chapters/following_users?version=6.0#sec-exercises_rest_api)機能の実装に取り組んでみたので、コードを掲載します。

誤っている点や改善点などあれば教えていただけると幸いです。

## 環境
“`
$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.15.4
BuildVersion: 19E287
$ ruby -v
ruby 2.6.5
$ rails -v
Rails 6.0.0
“`

## 前提
Usersリソースのみに機能を追加しました。
すなわち、`index`アクション、`show`アクション、`create`アクシ

元記事を表示

【Rails】deviseの導入 基礎

Railsアプリにて、ユーザー管理機能のためのgemである、
「devise」を導入する基本の手順を
備忘録も兼ねてご紹介。

# 1. Gemfile に devise を追加
最下行に記載。

“`:Gemfile
gem ‘devise’
“`
**bundle instrall**を実行する。

# 2. devise を適用させる

“`:ターミナル
rails g devise:install
“`
# 3. devise仕様の Userモデルを作成
通常のモデル作成用コマンドとは違って、devise専用のコマンドで、
Userモデルを作成します。

“`:ターミナル
rails g devise user
“`
実行後、ルーティングに「devise_for :users」と追記され、
ログインと新規登録で必要なルーティングが生成されるようです。

◉ 続けて実行します。

“`:ターミナル
rails db:migrate
“`

# 4. 新規登録・ログインできるようにする
ヘッダー等に「新規登録」「ログイン」できるボタンを作る。
**user_sign

元記事を表示

VSCode個人的拡張機能(Ruby on Rails開発)

##zenkaku
##Rainbow End
##indent-rainbow
##endwise
##Code Spell Checker
![https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_52879_9be70954-9219-dadb-1485-f1fb5c633c1d.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/611668/4eec05de-3715-70b4-f4f9-b960669b6185.gif)
スペルミスを検出してくれる拡張機能です。
適応されるファイルタイプが以下のタイプのみとなります。

“`:defaultでサポートされているfiletype
AsciiDoc
C, C++
C#
css, less, scss
Elixir
Go
Html
Java
JavaScript
JSON / JSONC
LaTex
Markdown
PHP
PowerShell
Pug / Jade
Python
re

元記事を表示

devise導入

#deviseの使い方メモ

gemfileにdeviseというGemを追加。

“`ruby:gemfile
gem ‘devise’
“`

ターミナル内で該当ディレクトリ(今回はsample)へ移動し、
「bundle install」でGemをインストールしてから、
「rails g devise:install」を実行してdeviseの設定ファイルを作成しましょう。

“`ruby:ターミナル
$ cd ~/projects/sample

$ bundle install

$ rails g devise:install
“`

**新規作成されるファイル**

– config/initializers/devise.rb
– config/locales/devise.en.yml

ファイルが作成されたのを確認できたら、
deviseのモデル作成用コマンドでUserモデルを作成しましょう。

“`ruby:ターミナル
rails g devise user
“`
**新規作成されるファイル**

– app/models/user.rb
– db/

元記事を表示

dockerで作ったRailsプロジェクトをロリポップ!マネージドクラウドにあげるのに手こずった話

# 前置き
dockerを使ってRailsの開発を趣味でやっていた。
ひと段落ついたので、サーバーに公開しようと思ったがエラーが出てなかなかうまくいかなかった話です。

# エラーの内容
“`console:console
ArgumentError: Missing `secret_key_base` for ‘production’ environment, set this string with `rails credentials:edit`
“`

# 解決法
“`console:console
EDITOR=vim rails credentials:edit –environment production
“`

dockerに入って上のコマンドを実行していたが、Vimが入っていなかったので、一見できてるようでできていなかった。
編集画面が出てこないのでおかしいとは思っていたが、ファイルはしっかり生成されているし大丈夫だと思っていたのが罠だった。

あとはマネクラのプロジェクト管理画面で環境変数の設定をしておく。
</p></blockquote>
</blockquote>
<aside class='widget widget-post'>
<div class='tag-cloud-link'>Rails</div>
<div class='tag-cloud-link'>Docker</div>
<div class='tag-cloud-link'>docker-compose</div>
<div class='tag-cloud-link'>lolipopマネージドクラウド</div>
</aside>
<div><a style='width:100%;' class='btn__link' href='https://qiita.com/harachan/items/f6fb19af81f8562c9943'>元記事を表示</a></div>
<h3 id=rails 1対多 保存の方法 紛らわしいやつまとめ(メモ)

1対多のリレーションでも保存の方法の違いが紛らしいな

### 1番基本

– 1つ1つリレーションを作るパターン

“`ruby
## リレーション

User 1 – * Post

## user.rb
has_many :posts

## post.rb
belongs_to :user

## controller

def new
@post = Post.new

def create
@post = Post.new(post_params)

private

def post_params

params.require(:post).permit(:name, :body).merge(user_id: current_user.id)

## view
= form_for @post do |form|

= form.label :title
= form.text_field :title

= form.label :body
= form.text_field :body
= form.submit ‘送信’

元記事を表示

rails リレーション色々

– 1対多

ツイート機能

“`ruby
class User
has_many :twees
end

class Twitter
belongs_to user
end

## schema
users
name:string

tweets
body:string
user:refrences
“`

– 自己参照型

like機能

“`ruby

class User < ApplicationRecord has_many :likers,foreign_key: "liker_id",class_name: "Like" has_many :likeds,foreign_key: "liked_id",class_name: "Like" end class Like < ApplicationRecord belongs_to :user, foreign_key: "liker_id", class_name: "User" belongs_to :user, foreign_key: "liked_id" , class

元記事を表示

Railsの基礎知識の備忘録

個人的に忘れやすいことをメモ的な意味で書きます。

# ActiveRecordクラス
テーブルから情報を取得するため位必要なメソッドを兼ね備えたクラス。
メソッド一例

# メソッド 用途
●全てのデータを取得する
使用例)postテーブルに保存されているデータの全てを取得して@postsにインスタンス変数し、ビューファイルに使用できるようになる。
“`@post = Posts.all“`
↓複数のデータを表示しようとするとエラーが出る。
“`

トップページ

<%= @posts.content %>
<%= @posts.created_at %>“`
↓eachメソッドを使って順番に処理させることで解決。
“`

トップページ

<% @posts.each do |post| %>
<%= post.content %>
<%= post.created_at %>
<% end %>“`

●テーブルのレコードの内、ある一つのデータを取得する
使用例)1番目のレコードのみ取得
“`@post = Post.find(1)“

元記事を表示

Rails セキュリティー

#前提
本日学んだセキュリティーについて書いていきます。

#本題

#リダイレクトとファイル
セキュリティ上の脆弱性として検討したいのは、Webアプリケーションにおける「リダイレクトとファイル」。

##リダイレクト
Webアプリケーションにおけるリダイレクトは、過小評価されがちなクラッキングツール。
攻撃者はこれを使ってユーザーを危険なWebサイトに送り込んだり、Webサイト自体に罠を仕掛けたりすることもできる。

リダイレクト用のURL (の一部) を渡すことをユーザーに許すと、潜在的な脆弱性となる。
最もあからさまな攻撃方法としては、ユーザーを本物そっくりの偽Webサイトにリダイレクトすることが考えられる。
これは俗に「フィッシング(phishing)」や「釣り」などと呼ばれる攻撃手法。
具体的には、無害を装ったリンクを含むメールをユーザーに送りつけ、XSSを使ってそのリンクをWebアプリケーションに注入するか、リンクを外部サイトに配置する。
このリンクの冒頭部分はそのWebアプリケーションのURLなので、一見無害に見える。

##ファイルアップロード
ファイルがアップロード

元記事を表示

【Rails】iframeタグを使って外部コンテンツが埋め込めない

## iframeで外部ページを埋め込む時の問題
ページに組み込んだiframeが表示されない問題についての対処法です。
ブラウザのコンソールをチェックしてみると、以下のエラーが表示されている場合があるかもしれません。

“`html:error
Refused to display xxxxx in a frame because it set ‘X-Frame-Options’ to SAMEORIGIN’.
“`
これはRailsでデフォルトのセキュリティヘッダーのX-Frame-Options が`SAMEORIGIN`になっているからです。

# **X-Frame-Options**
> X-Frame-Options は HTTP のレスポンスヘッダーで、ブラウザーがページを frame, iframe, embed, object の中に表示することを許可するかどうかを示すために使用されます。サイトはコンテンツが他のサイトに埋め込まれないよう保証することで、[クリックジャッキング](https://ja.wikipedia.org/wiki/%E3%82%AF

元記事を表示

Rails6のActionTextでransackがうまく使えないので検索できるようにする

# これはなに?
Rails6で導入されたActionTextにより簡単にブログ機能を実装できるようになりました。
大変ありがたいお話なのですが、検索機能を定番のgemであるransackを使って実装しようとしたらエラーになり使えませんでした。

その時の対処法を記載します。

# どうすればいいのか?
結論から言うと、**ransack使わない**ですね。タイトルと若干逸脱してる気もしますが、動けばいいと思います。

# 手順
こっから具体的な解決までのプロセスです。

## 事象
まずransack使うとどうなるかって話ですね。下記のようなエラーになります。

“`shell
Completed 500 Internal Server Error in 42ms (ActiveRecord: 1.4ms | Allocations: 5041)
05:42:11 web.1 |
05:42:11 web.1 |
05:42:11 web.1 |
05:42:11 web.1 | ActionView::Template::

元記事を表示

Railsで7つの基本アクション以外の定義

#基本アクションのおさらい

以下がRailsの標準アクションです
スクリーンショット 2020-05-16 15.12.28.png

#自分でアクションを定義する

上記の基本アクション以外の処理を行いたい場合は自身で定義することができます。

その際のルーティングの定義方法には**collection**と**member**が使えます

“`rb

Rails.application.routes.draw do
resources :hoges do
collection do
HTTPメソッド ‘オリジナルのメソッド名’
end
end
end
“`

“`rb
Rails.application.routes.draw do
resources :hog

元記事を表示

【rails】RSpecによる単体テスト(コントローラ)

### 準備

Gem“` rails-controller-testing “`をインストールする。

“`ruby:Gemfile
group :development, :test do
# Call ‘byebug’ anywhere in the code to stop execution and get a debugger console

gem ‘rails-controller-testing’ #追記
end
“`

“`console:terminal
$ bundle install
“`

次のディレクトリを作成する。
 “` spec/controllers “`

次のファイルを作成する。
 “`spec/controllers/tweets_controller_spec.rb“`

“`ruby:spec/controllers/tweets_controller_spec.rb
require ‘rails_helper’

describe TweetsController do

end
“`

元記事を表示

docker-composeでRails5.2+MySQL開発環境

(社内の特殊な環境を移行した際のメモです)

rubyのイメージでうまく環境を構築できなかった(=既存のrails環境のGemfileと一致するバージョンのgemが揃わなかった)ため、Ubuntuのイメージから出発してRailsの環境を構築した際の設定です。

“`yml:docker-compose.yml
version: ‘3’
services:
db:
image: mysql:5.7
command: mysqld –character-set-server=utf8mb4 –collation-server=utf8mb4_unicode_ci
volumes:
– ./tmp/mysql:/var/lib/mysql
environment:
– MYSQL_ROOT_PASSWORD=secret
web:
build: .
command: “rails s -p 3000 -b ‘0.0.0.0’”
volumes:
– ./:/railsapp
po

元記事を表示

情報セキュリティについてのまとめ

###情報セキュリティ

情報セキュリティとは、WEBサービスにおいてのセキュリティのことを指します。
情報漏洩や不正なアクセスを防ぎつつ権限のあるユーザーの利便性を高めるのが理想です。

下記の3つを保持することがWEBサービスの使命です。
1.機密性
-権限のない人が情報資産を見たり使用したりできないようにする
2.完全性
-権限のない人が情報を消したり書き換えたりできないようにする
3.可用性
-権限のある人(ユーザー)がサービスをいつでも利用できるようにする

全てにおいてのセキュリティをおびやかす欠陥や問題点のことを脆弱性と言います。
また、脆弱性は開発者のチェック不足やバグによって生まれます。

脆弱性の具体例は以下です
-個人情報を勝手に閲覧される(機密性の侵害)
-WEBページの内容が改ざんされる(完全性の侵害)
-WEBページの利用ができなくなる(可用性の侵害)

ユーザーへの金銭的補填、開発者の信頼の失墜、機会損失などの被害が生まれてしまうため、

元記事を表示

Rubyとは?Railsとは?

##記事の概要
Ruby/Ruby on Railsとは何か分からない人が少し理解できるようになります。

##Rubyとは

Rubyとはプログラミング言語の一つです。
小さいプログラムから大きいWebアプリケーションまでを実用的に作成することができます。

####Rubyの特徴
・簡潔な文法で記述することができる
・コードが読みやすい
・プログラムを記述してすぐに実行することができる

####Rubyを使用しているサイト
・Twitter
・hulu
・クックパッド
・食べログ
・楽天市場
・Airbnb

##Railsとは
Railsとは、Ruby on Railsの略称です。Railsと言われることが多いです。
RailsはWebアプリケーションフレームワークの1つで、最も多く使われています。
Rubyという言語を使ってWebアプリケーションを作っていきます。

####Webアプリケーションフレームワークとは?
Webアプリケーションフレームワークとは、Webアプリケーションを簡単に作るための骨組みのことです。
これを使うことによってより少ない労力で開発することがで

元記事を表示

ルーティングのネスト

#ルーティングのネストとは

通常のルーティングの記述は

“`rb

Rails.application.routes.draw do
resources :親となるコントローラー
resources :親となるコントローラー
resources :親となるコントローラー ,,,,,
end
“`

という感じでそれぞれ独立した形でコントローラーへのルーティングを生成していますが、

ルーティングのネストをすると、あるコントローラーのルーティング内に、別のコントローラーのルーティングを記述することができます

“`rb
Rails.application.routes.draw do
resources :親となるコントローラー do
resources :子となるコントローラー ←階層を下げ、do,,,endで囲む
end
end
“`

#使用するメリット

例えば、インスタグラムやツイッターなどにはコメント機能があります。

そして、そのコメントは、必ず投稿先が存在しています。

それでは、ネストをしないでルーティン

元記事を表示

【Rails】remote:true形式でAjax通信を行う(ブックマーク機能のajax化)

## Ajaxとは
**Ajax**とは、Webブラウザ上で`非同期通信`を行い、ページ全体の再読み込み無しにページを更新する方法のことです。

#####同期通信について

`同期通信`では、クライアントはwebページ全体の情報(HTMLとそれに紐づくcss,js,imageなどのアセット)をサーバーから受け取って、ページを一から作り直します。
例えばページの一部を変更するだけなのに、他の部分も組み立て直すってことはその分ページの表示に時間がかかっちゃいます。(サーバー側の処理を待つことになる)

しかも、この**リクエスト〜レスポンス**の処理を行っている間は、他の処理を行わずに**サーバーからレスポンスが返ってくるのを待ち続ける**必要があります(よくあるのが画面が真っ白になって何もできない状態)。

そこでAjaxのような非同期通信を使用すれば、**ページ遷移無しに、高速で更新処理**を行い、尚且つ、**リクエスト〜レスポンスの処理を行っている間も他の処理が行えます**。

######非同期通信の方法は2種類

この便利なAjaxによる非同期通信を行う方法としては、

元記事を表示

Day9 #RailsApp作成手順~#new/#create/#destroy/#edit/#update/#showアクション/#login/#mypage/#n+1問題/#user_signed_in?

#### 5. newアクションの設定
##### Ⅰ. ルーティング
“`config/routes.rb
Rails.application.routes.draw do
resources :tweets, only: [:index, :new]
end
#newのpathを構築
“`

##### Ⅱ. コントローラー定義
“`app/controllers/tweets_controller.rb
def new
@tweet = Tweet.new
end
#Tweetクラスのインスタンス@tweetを生成
“`

##### Ⅲ. ビュー作成
“`erb:app/views/tweets/new.html.erb

<%= form_with(model: @tweet, local: true) do |form| %>

投稿する

<%= fo

元記事を表示

Day13-14 Rails 検索機能を実装

#1.検索フォーム作成

“`erb:app/views/tweets/index.html.erb
<%= form_with(url: search_tweets_path, local: true, method: :get, class: "search-form") do |form| %>
<%= form.text_field :keyword, placeholder: "投稿を検索する", class: "search-input" %>
<%= form.submit "検索", class: "search-btn" %>
<% end %>
“`

#2. ルーティング
collection:ルーティングに:idがつかない
member:ルーティングに:idがつく
→検索機能は:id取得する必要がないので、collenction

“`config/routes.rb
collection do
get ‘search’
end
“`

#3. searchメソッドをTweetモデルに定義
ビジネスロジック(プログラムの処理の流れ)は、メソッ

元記事を表示

OTHERカテゴリの最新記事