20210915のRailsに関する記事は12件です。

deviseで作成したログインページのviewの編集が反映されない(メモ)

事象詳細 devise導入後、Viewを編集して反映されていたのに何故か急に反映されなくなり、devise導入直後のようなレイアウトに戻ってしまった。 試したこと ・rails server再起動 ・bundle install ・DBのrollback、migrate ・PCの再起動 上記を何度繰り返しても改善されなかった ログを確認 rails serverコマンドで立ち上げる際にターミナルのコマンドをよく見てみると、いつものrender先ではないことに気がついた Rendering layout /Users/*****/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/letter_opener_web-1.4.0/app/views/layouts/letter_opener_web/letters.html.erb Rendering /Users/*****/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/letter_opener_web-1.4.0/app/views/letter_opener_web/letters/index.html.erb within layouts/letter_opener_web/letters Rendered /Users/*****/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/letter_opener_web-1.4.0/app/views/letter_opener_web/letters/index.html.erb within layouts/letter_opener_web/letters (Duration: 4.9ms | Allocations: 882) Rendered /Users/*****/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/letter_opener_web-1.4.0/app/views/layouts/letter_opener_web/_styles.html.erb (Duration: 0.7ms | Allocations: 46) Rendered /Users/*****/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/letter_opener_web-1.4.0/app/views/layouts/letter_opener_web/_javascripts.html.erb (Duration: 0.2ms | Allocations: 45) Rendered layout /Users/*****/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/letter_opener_web-1.4.0/app/views/layouts/letter_opener_web/letters.html.erb (Duration: 7.3ms | Allocations: 1227) 立ち上げてほしいViewsファイルを指していない。 どこを指してる。。。。。? 解決方法 render先を元に戻すにはconfig/initializers/devise.rbのconfig設定を以下のように変更する config.scoped_views = true これでapp/views/usersが優先されてrenderの指定先になる -- 参考 【Rails】認証機能を実装するdeviseの導入方法 以上
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

VagrantでRuby on Railsの開発環境構築をしたメモ

はじめに Railsをいじったことが少しありますが、改めて勉強し直したいと思い、Railsチュートリアルをやろうとするも、開発環境構築でかなり苦戦したので、自分用のリンクメモです。先人の皆様ありがとうございます‥! もっと良い方法など教えていただけると嬉しいです 環境 macOS Catalina 10.15.7 VirtualBox 6.1 Vagrant 2.2.18 Ubuntu 18.04 Ruby 2.6.8 Ruby on Rails 6.0.3 rbenv 1.1.2-2-g4e92322 全体像 この辺の図でやることのイメージがつきました。 VirtualBoxやVagrantを用いたRails開発環境の構築方法(前編)に載っています。 やったこと 1. VirtualBoxとVagrantのインストール 公式サイトからソフトウェアをインストール VirtualBox Vagrant 2. 作業フォルダの作成 ディレクトリ名は任意 自分の場合は{User名}配下に作成 $ mkdir Vagrant $ cd Vagrant $ mkdir rails_dev 3. Vagrantfileの作成 作業フォルダでVagrantfile作成する $ vagrant init bento/ubuntu-18.04 4. Vagrantfileの修正 修正ポイント①(31行目) ポートはrails仕様で3000番ポートが使用されるため、仮想環境の3000番ポートをローカルPCの3000番ポートに転送(ポートフォワード)を行う 修正ポイント②(35行目) ホスト側(Mac)から見れるようにIPアドレスの開放を行う 修正ポイント③(46行目) 前提として、Vagrantはホスト、ゲスト間でファイルを同期できる ホスト側で好みのエディタで作業できるように、ゲスト側の作業ディレクトリと同期する設定を行う <ホスト側(Mac)の相対パス> <ゲスト側(Ubuntu)の絶対パス> となることに注意 Vagrantfile # -*- mode: ruby -*- # vi: set ft=ruby : # All Vagrant configuration is done below. The "2" in Vagrant.configure # configures the configuration version (we support older styles for # backwards compatibility). Please don't change it unless you know what # you're doing. Vagrant.configure("2") do |config| # The most common configuration options are documented and commented below. # For a complete reference, please see the online documentation at # https://docs.vagrantup.com. # Every Vagrant development environment requires a box. You can search for # boxes at https://vagrantcloud.com/search. config.vm.box = "bento/ubuntu-18.04" # Disable automatic box update checking. If you disable this, then # boxes will only be checked for updates when the user runs # `vagrant box outdated`. This is not recommended. # config.vm.box_check_update = false # Create a forwarded port mapping which allows access to a specific port # within the machine from a port on the host machine. In the example below, # accessing "localhost:8080" will access port 80 on the guest machine. # NOTE: This will enable public access to the opened port # config.vm.network "forwarded_port", guest: 80, host: 8080 # Create a forwarded port mapping which allows access to a specific port # within the machine from a port on the host machine and only allow access # via 127.0.0.1 to disable public access config.vm.network "forwarded_port", guest: 3000, host: 3000 # Create a private network, which allows host-only access to the machine # using a specific IP. config.vm.network "private_network", ip: "192.168.33.10" # Create a public network, which generally matched to bridged network. # Bridged networks make the machine appear as another physical device on # your network. # config.vm.network "public_network" # Share an additional folder to the guest VM. The first argument is # the path on the host to the actual folder. The second argument is # the path on the guest to mount the folder. And the optional third # argument is a set of non-required options. config.vm.synced_folder "./work", "/home/vagrant/work", create: "true" # Provider-specific configuration so you can fine-tune various # backing providers for Vagrant. These expose provider-specific options. # Example for VirtualBox: # # config.vm.provider "virtualbox" do |vb| # # Display the VirtualBox GUI when booting the machine # vb.gui = true # # # Customize the amount of memory on the VM: # vb.memory = "1024" # end # # View the documentation for the provider you are using for more # information on available options. # Enable provisioning with a shell script. Additional provisioners such as # Ansible, Chef, Docker, Puppet and Salt are also available. Please see the # documentation for more information about their specific syntax and use. # config.vm.provision "shell", inline: <<-SHELL # apt-get update # apt-get install -y apache2 # SHELL end 5. Vagrantを起動、接続する 起動して、接続します $ vagrant up $ vagrant ssh 6. Ruby on Railsのインストール versionやファイル名は変えましたが、下記サイトの「動作確認用の新規アプリケーションの作成」までを踏襲しました。 Vagrantの共有フォルダ設定ができていれば、rails newを実施すると、ホスト側(Mac)のディレクトリにRailsファイルができています 7. Gemfileの修正 Railsチュートリアルの「1.3.1 Bundler」以降をたどりました 8. rails serverの実施 ゲスト側(Ubuntu)で下記実施して、http://localhost:3000/にアクセスできると思います $ bundle exec rails s -b 0.0.0.0 99. エラーが出たら ひたすらエラーメッセージでググりましょう、、、ググっているうちに分かることも多いです リンク 流れの全体感 【環境構築】Ruby on Rails 6 開発環境を1時間以内に手に入れる VagrantでRailsのローカル開発環境構築する VagrantでRuby On Rails開発環境を構築~デプロイ Vagrant周り(Vagrantfileの修正内容など) [Rails][Vagrant]Vagrantの rails server で起動しているアプリケーションにローカルPCからブラウザアクセスする VirtualBoxやVagrantを用いたRails開発環境の構築方法(前編) Vagrantで共有フォルダ設定(ファイル共有)する方法【VirtualBox】 vagrant upしようとすると「To fix this, modify your current project’s Vagrantfile to use another port. Example, where ‘1234’ would be replaced by a unique host port:」というエラーがでる。 Rails周り 【Rails 6.0.0.rc2】rails s したら RAILS_ENV=development environment is not defined in config/webpacker.yml, falling back to production environment Exiting で怒られた。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

患者(ユーザー)ごとにindex表示したい whereを使う

1)患者(ユーザー)ごとにindex表示したい 患者1 ーーー患者3の記録 患者2の記録のようになってしまった staff/record/index.html.erb def index @records = Record.all(params[:patient_id]).page(params[:page]).per(7).reverse_order end ↓↓↓↓↓↓ def index @records = Record.where(patient_id: params[:patient_id]).page(params[:page]).per(7).reverse_order end ユーザーごとに投稿&自分の投稿一覧indexしか見えないのが正しい、 でも見えちゃう問題 def index @dialies = Dialy.all       end としていた。他のユーザー記録が見える.... current_ whereを用いる def index @dialies = current_patient.dialies.all あるいは  @dialies = Dialy.where( parient.id: current_patient.id) #全体の中から絞って持ってくる    end
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

9.15振り返り  パスが飛ばせない、ユーザーごとの一覧表示できない問題

1)pathを確認して書いたのに動かない =link_to "詳細",staff_patient_record_path(patient_id,record.id)"%>でエラー staff/record/index.html.erb <%@records.each do |record|%>                                       エラー :                                                                                           ↓↓↓ # =link_to "詳細を見る",staff_patient_record_path(patient_id, record.id)"%>でエラー : <%end%> staff_patient_record GET /staff/patients/:patient_id/records/:id(.:format) staff/records#show patients/:patient_idとrecords/:idが必要なのはわかった  指定しても動かない patient_id→→record.patient_idモデルで持ってくる staff/record/index.html.erb <%@records.each do |record|%>の中にあるためrecordがない、急にpatientは使えない : # =link_to "詳細を見る",staff_patient_record_path(patient_id, record.id)"%>でエラー ↓↓↓ model:recordで持ってくる <%=link_to "詳細を見る",staff_patient_record_path(record.patient_id, record.id)"%> : <%end%> model/record.rb class Record < ApplicationRecord :   #recordモデルで紐づけているため明示すれば持ってこれる belongs_to :patient : end
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

コントローラの使われ方がわかんない

MVCのことはちゃんと理解した方がいいから備忘録。 1.コントローラとは MVCモデルのC。ユーザーからのリクエストを受け取り、モデルを介してデータを授受したり、ビューを用いてHTML出力を生成するもの。 見方を変えると、コントローラはモデルとビューの仲介をしているとも取れる。モデルのデータをビューで使えるようにすることで、データをビューで表示したり、入力されたデータでモデルを更新したりする。 2.コントローラの作り方 ターミナルにおいて下記のように入力して生成する。 % rails g controller (コントローラ名) コントローラの名前は複数形を使うことが一般となっている。 絶対ではないが遵守することで、既存のルーティングジェネレータがそのまま使えたり、名前付きのルーティングヘルパーの用法がアプリケーション全体で一貫する。 3.メソッドとアクション railsのコントローラは全てApplicationControllerを継承したRubyのクラスとなっている。例えば、SamplesControllerというコントローラがあったとして下記のような記述が冒頭にあることから左記のようなことがわかる。 class SamplesController < ApplicationController #継承を示している 記述の凡例 class SamplesController < ApplicationController def new end end このような記述の場合、/samples/newにアクセスをするとSamplesControllerのインスタンスを作成してnewメソッドを呼び出す。ここでnewメソッドは内容が空でも、railsではアクションで特に指定がない場合はnew.html.erbというビューを返すことになっている。 4.パラメータ コントローラのアクションではユーザーから送られてきたパラメータにアクセスをして何かの作業を行う。 パラメータのは2種類あって、一つはURLの一部として送られる「クエリ文字列(URL)パラメータ」もう一つはフォームから受け取る「POSTパラメータ」がある。いずれもparamsというハッシュでアクセスできる クエリパラメータ例 https://hogehoge.jp/fugafuga?id=1 上記の?id=1の部分がクエリ文字列(URL)パラメータにあたる。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

本番環境でgoogle認証ログインができない時の解決方法

はじめに 本番環境にて、google認証ログインを行った時以下のようなエラーが発生した。 結論 原因としては、本番環境にclient_idが記述された.envが存在していないことだった。 本番環境にも.envを作成すると、google認証することができた。 しかし、自分は.envはgithubに上げないようにしているため、デプロイすると再び.envが読めなくなり、google認証できなくなってしまう。 そのため、デプロイ時に毎回.envを本番環境に作成しなくてもいいようタスクを作成した。 #capfile namespace :deploy do desc "upload env" task :sync_env do on roles(:app) do |host| upload! ".env","#{shared_path}/.env" #デプロイ時、shereフォルダへローカルの.envをコピー(※大切な情報のためcurrentよりもsharedに入れたほうがいいらしいので) execute "ln -s #{shared_path}/.env #{current_path}/.env" #currentではなく、sharedの.envを参照させる end end end
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【web開発初心者】おすすめRuby on railsのUdemy講座まとめ。高コスパ講座を6つ厳選

webアプリのサーバーサイド開発に人気の高いRuby on RailsのオススメUdemy講座のまとめです。 数あるRoRの講座の中でも初心者に優しく評価が高いものだけを厳選しました。 Rubyの文法やweb開発(サーバーサイド)の経験が現時点で無くても大丈夫です。 はじめてのRuby on Rails入門-RubyとRailsを基礎から学びWebアプリケーションをネットに公開しよう おすすめ度:★★★★★ ・はじめてのRuby on Rails入門-RubyとRailsを基礎から学びWebアプリケーションをネットに公開しよう この講座で学べる内容 ・Ruby on RailsとRubyを使った実践的な開発スキル ・Ruby on RailsとRubyの違いを理解 ・Webサービスを公開する方法 ・クラウドサービス、HerokuのPaaS(Platform as a Service)を使ってサービスをネット上に公開する方法を学ぶ ・AWS Cloud9を使った開発環境の構築 ・Web系の企業転職の際に魅力的に映るポートフォリオサイトの作成 Ruby on Rails 5入門 -Rubyプログラミングの基礎から学べる- おすすめ度:★★★★★ ・Ruby on Rails 5入門 -Rubyプログラミングの基礎から学べる- この講座で学べる内容 ・プログラミング言語Rubyのプログラミングができる ・Cloud9を使ってRuby on Rails 5の開発環境が構築できる ・Ruby on RailsによるHello World! プログラムが書ける ・シンプルな電話帳アプリの開発を通して、CRUDアプリケーションの開発ができる ・Ruby on Railsを学ぶ上で重要な用語の意味を知ることができる フルスタックエンジニアが教える 即戦力Railsエンジニア養成講座 おすすめ度:★★★ ・フルスタックエンジニアが教える 即戦力Railsエンジニア養成講座 この講座で学べる内容 ・Ruby on Rails 5を使用した即戦力レベルのアプリケーション作成のスキルを身に着けることができます ・Webアプリケーションを作成できるようになります ・「なんとなく動く」ではなく本格的に開発を行うためのノウハウを学ぶことが出来ます ハンズオンで学ぶRuby on Rails 6 おすすめ度:★★★★★ ・ハンズオンで学ぶRuby on Rails 6 この講座で学べる内容 ・Rails 6の新機能Action Textを利用したブログページの実装方法 ・デバッグツール(pry、pry-rails、pry-byebug、等)の導入方法から使用方法及びツールを用いたソースコードリーディングの方法について ・ActionTextが生成する各種テーブルの相関やテーブル内部のデータ構造 ・Action Textが提供する各種レコードの属性に対する検証(バリデーション)の方法 ・経済的にストレージスペースを活用するための1つのアイデア [Rails4系です] Rails入門:基礎をSinatraで理解しRailsで作れるようになる おすすめ度:★★★★ ・[Rails4系です] Rails入門:基礎をSinatraで理解しRailsで作れるようになる この講座で学べる内容 ・「最初はRailsを触らずにSinatraでの開発を通じて」WEBサービスの基本的で普遍的な仕組みを理解することができます。 ・フレームワークの仕組みをある程度理解した上でRailsのWEBサービスが構築できるようになります。 ・WEBサービスに機能を追加しようとした際に、何をすればいいのかがイメージできるようになります。 ・「最初のオリジナルサービス」を開発する一歩手前までの必要な知識を獲得できます。 【3日でできる】はじめての Ruby on Rails 4 入門(Rubyから学べる) おすすめ度:★★★★ ・【3日でできる】はじめての Ruby on Rails 4 入門(Rubyから学べる) この講座で学べる内容 ・Rubyの基本文法について理解できるようになる ・データベースと連動したアプリケーションをRuby on Railsで作成できるようになる ・Railsのコマンドやメソッドを理解できるようになる その他のUdemy講座 ・Java初心者に超オススメ出来るUdemy動画講座7選まとめ。最速マスター特化 ・Typescript入門におすすめのユーデミー講座5選。JS未経験者も可 ・【Androidアプリ開発】Kotlin初心者向けの超おすすめUdemy講座6選をまとめた ・SQL未経験者にオススメのユーデミー動画講座6選!データ分析したい人向け ・【Python】サーバーサイド初心者にオススメのUdemyのDjango動画講座5選 ・iPhoneアプリ作成入門に最適なUdemyのオススメSwift講座5選 ・【学習効果・高】ブロックチェーン入門に最適なUdemy講座おすすめ6選
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ActiveHashのname出力でNoMethodError

おそらく同じケースに陥っている方は僅少かと思いますが かなり初歩的なミスだったので 戒めも兼ねて記録します。 問題 状況 分析 解決法 1. 問題 複数のActiveHashのname表示において 一部のモデルのみNoMethodErrorとなってしまっています。 2. 状況 ・users/:idのパスにてusers#showアクション呼び出し ・ビューの項目のうち複数でActiveHashを利用(下記show.html.erb参照) ・一部の項目では正常にnameが呼び出される(下記ターミナル参照) users/show.html.erb <%= @user.nickname %><br> ---(略)--- <%= @user.sex.name %><br> <%= @user.character.name %><br> <%= @user.what_paly.name %><br> <%= @user.genre.name %><br> <%= @user.prefecture.name %><br> <%= @user.active_day.name %><br> <%= @user.skill.name %><br> <%= @user.leader_or_member.name %><br> ---(略)--- ターミナル app/controllers/users_controller.rb:9 UsersController#show: 7: def show 8: @user = User.find(params[:id]) => 9: binding.pry 10: end [1] pry(#<UsersController>)> @user.sex.name NoMethodError: undefined method `sex' for #<User:0x00007fba2d60fbf0> Did you mean? send from /Users/okazakiryousuke/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activemodel-6.0.4.1/lib/active_model/attribute_methods.rb:432:in `method_missing' [2] pry(#<UsersController>)> @user.sex_id => 2 [3] pry(#<UsersController>)> @user.active_day.name => "火曜日" 3. 分析 複数のActiveHashのうち うまく表示されるものとされないものがあるようです。 よって項目によって個別に存在する設定、 ActiveHashのモデル および Userモデル の記述が怪しいと思われます。 4. 解決法 アソシエーションの記述が間違っていました。 belongs_toについて 以下のように記述してしまっていました。 models/user.rb belongs_to :active_day, :character, :genre, :leader_or_member, :prefecture,:sex, :skill, :what_play belongs_toのモデル名は validatesのカラム名のように , を使った複数の記述はできません。 その為に最初のカラムのみ アソシエーションがかかっていました。 これを修正します。 models/user.rb belongs_to :active_day belongs_to :character belongs_to :genre belongs_to :leader_or_member belongs_to :prefecture belongs_to :sex belongs_to :skill belongs_to :what_play 以上の処理によって 無事に表示がされるようになりました。 今回はここまでです。 お読みくださりありがとうございました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Rails6]削除ボタンが動作せず、アラートも動かず、削除ボタンを押すと参照してしまう問題の解決方法

はじめに 「現場で使えるRuby on Rails5」で勉強している際に削除ボタンが動作しなく、エラーもなかったため少し沼にはまったので、解決までの過程を記録として残しておきます。(Javascriptについて分かって入れば楽に解決できることです) 前提・使用環境 ・Windows 10 ・Ruby 3.0.2 ・Rails 6.1.4.1 ・yarn 1.22.10 コード index.html.slim h1 タスク一覧 = link_to "新規登録", new_task_path, class: 'btn btn-primary' .mb-3 table.table.table-hover thead.thead-default tr th = Task.human_attribute_name(:name) th = Task.human_attribute_name(:created_at) th tbody - @tasks.each do |task| tr td = link_to task.name, task_path(task) td = task.created_at td = link_to "編集", edit_task_path(task), class: 'btn btn-primary mr-3' = link_to "削除", task , method: :delete, data: {confirm: "タスク「#{task.name}」を削除します。よろしいですか?"},class: 'btn btn-danger' tasks_controller.rb class TasksController < ApplicationController def index @tasks = Task.all end def show @task = Task.find(params[:id]) end def new @task = Task.new end def edit @task = Task.find(params[:id]) end def create task = Task.new(task_params) task.save! redirect_to tasks_url, notice: "タスク「#{task.name}」を登録しました。" end def update task = Task.find(params[:id]) task.update!(task_params) redirect_to task_url, notice: "タスク「#{task.name}」を更新しました。" end def destroy task = Task.find(params[:id]) task.destroy redirect_to tasks_url, notice: "タスク「#{task.name} 」を削除しました。" end private def task_params params.require(:task).permit(:name, :description) end end 起きた問題 Todoリストを作成したいる際に、削除ボタンを実装していた。 参考書通りにやっているのにも関わらず削除ボタンが動作せずに、削除ボタンをクリックすると参照してしまう問題が発生。 link_to "削除", task , method: :delete, data: {confirm: "タスク「#{task.name}」を削除します。よろしいですか?"},class: 'btn btn-danger' 特に削除ボタンのコードは間違えてなく、destroyアクションも間違っていない。 ブラウザーにもエラーが出ずここで手が止まる。 ここでJavascriptでアラートを data: {confirm: "タスク「#{task.name}」を削除します。よろしいですか?"} 出していたため、Javascriptがうまく動作していないと考えた。 javascripts/packs/application.js で「rails-ujs」が読み込まれているのを確認。 javascripts/packs/application.js import Rails from "@rails/ujs" javascripts/packs/application.js で alert(1) を記入してみると、やはりアラートが発生せずJavascriptがうまく読み込まれていないことが分かる。 application.html.slimの head のところに javascript_pack_tagが記入されていることも確認。 application.html.slim javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' ここでコンソールを見てみると Browser. bootstrap.esm.js:1 Uncaught Error: Cannot find module '@popperjs/core' とエラーが出ていた!! これだ!と思い、そのエラーについて調べてみと @popperjs/core moduleが見つけられないということだったので Yarnで上記モジュールをインストールしたらいけた。 解決策 下記のコマンドを実行 yarn install @popperjs/core うまくアラートも表示されて削除ボタンを動作した。 感想 すぐにコンソールを見ていれば、簡単に解決できるものでした。 最初はRubyのコードに問題があると思い込んでいたのでコードとずっと睨めっこしてましたww もっと多角的視点を持って取り組んでいきたいと思います。 備考 PowerShellを使ってたため、上記の解決策のコマンドを打つと下記のエラーが発生したため、その解決策も載せておきます。 エラー C:\Users yarn install @popperjs/core yarn : 'このシステムではスクリプトの実行が無効になっているため、ファイル C:\Users\nisin\AppData\Roaming\npm\yarn.ps1 を読み込むことができません。詳細については、 「about_Execution_Policies」(https://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。 発生場所 行:1 文字:1 + yarn install @popperjs/core Restricted : 用語 'Restricted' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。名前が正しく記述されているこ 発生場所 行:1 文字:1' + Restricted + ~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (Restricted:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException 解決策 下記のコマンドを実行 PS C:> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process ここについて詳しく知りたい人は下記の参考文献から見てください。 参考文献 [Rails6] Bootstrapが適用されない時の解決方法 PowerShellでこのシステムではスクリプトの実行が無効になっているため、ファイル hoge.ps1 を読み込むことができません。となったときの対応方法
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Rails]MVCについて自分の言葉でまとめてみる

先日、RailsのMVCについて説明する機会があったときに、 (緊張も相まって)全く日本語にならず、 「言語化できないって理解してるつもりでも理解できてないってことだな」 と猛反省したので、全くRailsを知らない人にも伝わるように、改めてまとめてみることにしました。 誤っている部分などありましたらご指摘いただけますと幸いです。 MVCとは Model / View / Controller の頭文字をとってMVCです。 Railsなど、Webアプリケーションを作るときに使うフレームワークの多くが、 このMVCの構造によって成り立っています。 Modelとは そのアプリケーションのデータベースの窓口のようなものです。 基本的にはデータベースの各テーブルに一つあって、データベースとのやりとりをしてくれます。 Viewとは Webアプリケーションの見た目の部分です。 Controllerとは アプリケーションがどう動くかをここで決めています。 (ほとんどが)各Modelに紐づいていて、そのModelにまつわる動きをコントロールしています。 動きをコントロール:Modelにお願いしてデータをとってきたり、そのデータを反映させたviewを返したりしています。 Routerとは いきなり出てきましたが、こちらもアプリケーションにとって大切な役割を担っています。 クライアントから渡ってきた、URLとHTTPメソッドから、どのControllerのどのActionを取るか、という指示を出している、案内板みたいなものです。 ざっくりまとめると クライアントからあったリクエストに応じて、 Routerが「こっちのControllerのこのActionを動かすんだよー」と指示。 Routerから指示があったControllerが指示されたActionをする。 (Modelを介してデータをやりとりしたり、Viewにデータを渡したり) ControllerがActionした結果を、人に見やすい形でViewで表現する。 参考 Railsガイド
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rails: フォームでdata-remote="true"を使うには

フォームにdata-remote="true"を付けたときの挙動について、ちゃんと理解していなかったので、ここにメモします。 ここらへんの機能はRails 7でHotwire(Trubo)で置き換わるようなので、いずれ無用な知識になるかもしれません。 form_withとform_forのオプション form_withにオプションlocal: falseを付けます。すると、HTMLのformにdata-remote="true"が付きます。 <%= form_with(model: @entry, local: false, id: 'entry-form') do |form| %> <form id="entry-form" action="/entries" accept-charset="UTF-8" data-remote="true" method="post"> Rails 6.0以前では、local: trueを付けないと、デフォルトでdata-remote="true"が付いてしまいます。この仕様は混乱の元だったと思います。Rails 6.1ではdata-remote="true"付かないのがデフォルトになりました。 なお、form_forに指定するときはremote: trueです。デフォルトは、6.0も6.1もfalseです。 <%= form_for(@entry, remote: true, html: { id: 'entry-form' }) do |form| %> data-remote="true"で送信し、リダイレクションを返した場合 コントローラで成功時にリダイレクションを返すとします。 def create @entry = Entry.new(entry_params) if @entry.save redirect_to @entry, notice: "保存しました。" else render :new, status: :unprocessable_entity end end data-remote="true"のときは、次のレスポンスが返ります。HTTPステータスは200、Content-Typeはtext/javascriptです。このレスポンスを受け取ると、rails-ujsがJavaScriptを実行します(Turbolinks.visitでページ遷移します)。 Turbolinks.clearCache() Turbolinks.visit("http://localhost:3000/entries/13", {"action":"replace"}) data-remote="true"+リダイレクションのときは、次の流れになります。 data-remote="true"のフォームを送信すると、rails-ujsはリクエストヘッダに「Accept: text/javascript, application/javascript, ...」を付けてAjaxで送信。 このとき、Railsでredirect_toを実行すると、ステータス302ではなく200で、上記のJavaScriptを送信する。 rails-ujsは、「Content-Type: text/javascript」のレスポンスを受け取ると、そのJavaScriptを実行する(RJS)。 困る点1: 失敗時の処理が必要 上記のコントローラでは、保存に失敗したときはHTMLを返しています。rails-ujsは、「text/javascript」以外が返ったときは自動的に何かしてくれるわけではありません。 困る点2: ajax:successイベントを処理しても遷移する 上記のサンプルでは、次のようにajax:successイベントを処理しても、rails-ujsがレスポンスのJavaScriptを実行してページ遷移してしまいます。 let form = document.getElementById('entry-form'); if(form) { form.addEventListener('ajax:success', (evt) => { // 独自の処理... }); } 実際にフォームでdata-remote="true"を使うには 次の例は、私がフォームでdata-remote="true"を使うときのやり方です(これが正解というわけではありません)。 コントローラでは、createとupdateはAjax専用ということにして、JSONだけを返します。RJS(レスポンスのJavaScriptを自動実行)は避けます。 成功時はredirect_toを使わずに、遷移先のパスをJSONデータで返します。失敗時はエラーメッセージの配列を返します。 def create @entry = Entry.new(entry_params) if @entry.save flash.notice = "作成しました。" render json: { location: entry_path(@entry) }, status: :created else render json: { errors: @entry.errors.full_messages }, status: :unprocessable_entity end  end def update @entry.assign_attributes(entry_params) if @entry.save flash.notice = "更新しました。" render json: { location: entry_path(@entry) }, status: :ok else render json: { errors: @entry.errors.full_messages }, status: :unprocessable_entity end end JavaScriptでは、rails-ujsのイベントajax:successとajax:errorsを処理して、リダイレクトしたりエラーを表示したりします。 let form = document.getElementById('entry-form'); if(form) { form.addEventListener('ajax:success', (evt) => { let data = evt.detail[0]; Turbolinks.visit(data.location); }); form.addEventListener('ajax:error', (evt) => { if(e.detail[2].status == 422) { let data = evt.detail[0]; // data.errorsを使って何かする } }); } 次の例は、erbで出力したフォームをVue.jsで処理するものです。 <%= form_with(model: entry, local: false, id: 'entry-form', '@ajax:success' => 'formAjaxSuccess', '@ajax:error' => 'formAjaxError') do |form| %> new Vue({ el: "#entry-form", data: { return { errors: [] } }, methods: { formAjaxSuccess(e) { let data = e.detail[0] Turbolinks.visit(data.location) }, formAjaxError(e) { if(e.detail[2].status == 422) { let data = e.detail[0] this.errors = data.errors } } } }); 以上です。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】Data Confirm Modal - backdrop

backdrop とは 直訳すると劇場幕のことで、Webではモーダルを開いたときの背景の黒いところのことを言います。 backdropをクリックしてもモーダルが非表示にならない方法 dataConfirmModal.confirm({ title: 'Are you sure?', text: 'Really do this?', commit: 'Yes do it', cancel: 'Not really', zIindex: 10099, onConfirm: function() { alert('confirmed') }, onCancel: function() { alert('cancelled') }, onHide: function() { alert('hidden') }, // これを追加することで、backdropをクリックしてもモーダルが非表示にならない backdrop: 'static' }); 参考 GitHub ifad / data-confirm-modal https://github.com/ifad/data-confirm-modal
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む