20211125のRailsに関する記事は7件です。

DBに保存できないデータを受け取るとき

DBに保存できないデータを受け取るとき(検索のパラメータなど) モデル.rb attr_accessor: を使えばいいらしい
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

railsで作るURL(ルート)について[超基礎]

ルータが作るURLは何者? クライアントとサーバー間でデータ受け渡すために指定された道のり 具体的に $ rails g model Users name:string $ rails db:migrate $rails g controller Post index create 説明のために、UsersテーブルとPostコントローラを作りました controller/posts_controller.rb def index user = User.all end def create user = User.new user.save end とりあえず、Postsコントローラに簡単な処理を書きました。 超簡単に説明すると、 indexアクションでは、 UserテーブルのDBから、Userテーブルのデータをクライアントに返す処理 createアクションでは、 クライアントから受け取ったデータを、DBのUserテーブルに保存する処理 が書かれています ルートを作る ようやくルートを作ります config/routes.rb get '/posts', to: 'posts#index' post '/posts', to: 'posts#create' indexアクションとcreateアクションに対応したルーティングを定義してるんです。 すると、下の写真のようなルートが生成されています。 GETはクライアントがサーバからデータを取得するためのHTTPメソッド POSTはクライアントがサーバにデータを送るためのHTTPメソッド つまり、 get '/posts', to: 'posts#index' によってできた道のりlocalhost:3000/Postsを通って、 Postsコントトーラのindexアクションの処理により、DBのUserテーブルからデータ取得する post '/posts', to: 'posts#create' によってできたlocalhost:3000/Postsを通って、 Postsコントトーラのcreateアクションの処理により、DBのUserテーブルにデータを保存する。 ということになります! 追記 config/routes.rb resources :posts, only: [:index, :create] 先程のルートはこのようにresourcesを使って省略することもできます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

fatal: remote origin already exists 新たにBitbucket上にリポジトリを作成してpushしようとしたらできなかった話。

Railsチュートリアル3章の序盤で起きた問題 Bitbucket上にリポジトリを作成してpushしようとしたら ❶ $ git remote add origin git@bitbucket.org:ユーザー名/sample_app.git fatal: remote origin already exists ❷ $ git push -u origin --all Please make sure you have the correct access rights and the repository exists. エラーをコピーしてないので前後にもう少し文があったような気もしますが、こんな感じのエラーが出てきました。 入れ物作れないしpush出来ないし! もうホント手順通りに進めてもうまくいかないんだから困っちゃうよなあw さてさてブツクサ言っても問題は解決しません。 ❶の方に関しては、もうあるみたいなので再度やる必要はないのですが、私はなんでもやってみたいので、一旦 origin を消して入れ直しました。 消してみる $ git remote rm origin これで再度 $ git remote add origin git@bitbucket.org:ユーザー名/sample_app.git はい解決できました。 逆にもう一度入力してみると… $ git remote add origin git@bitbucket.org:ユーザー名/sample_app.git fatal: remote origin already exists. と言うことだったんですねえ あるよー!!だってよ こちらが参考にさせていただいた記事です。 ❷に関しては 調べていくと、細かくは違えど、一貫して書いてあったのは、SSH 接続に問題が起こっている模様。 なので、SSHの公開鍵をも一度作り、再度$ git push -u origin --allを入力することで解決しました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

新たにBitbucket上にリポジトリを作成してpushしようとしたらできなかった話。

Railsチュートリアル3章の序盤で起きた問題 Bitbucket上にリポジトリを作成してpushしようとしたら ❶ $ git remote add origin git@bitbucket.org:ユーザー名/sample_app.git fatal: remote origin already exists ❷ $ git push -u origin --all Please make sure you have the correct access rights and the repository exists. エラーをコピーしてないので前後にもう少し文があったような気もしますが、こんな感じのエラーが出てきました。 入れ物作れないしpush出来ないし! もうホント手順通りに進めてもうまくいかないんだから困っちゃうよなあw さてさてブツクサ言っても問題は解決しません。 ❶の方に関しては、もうあるみたいなので再度やる必要はないのですが、私はなんでもやってみたいので、一旦 origin を消して入れ直しました。 消してみる $ git remote rm origin これで再度 $ git remote add origin git@bitbucket.org:ユーザー名/sample_app.git はい解決できました。 逆にもう一度入力してみると… $ git remote add origin git@bitbucket.org:ユーザー名/sample_app.git fatal: remote origin already exists. と言うことだったんですねえ あるよー!!だってよ こちらが参考にさせていただいた記事です。 ❷に関しては 調べていくと、細かくは違えど、一貫して書いてあったのは、SSH 接続に問題が起こっている模様。 なので、SSHの公開鍵をも一度作り、再度$ git push -u origin --allを入力することで解決しました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Herokuへseedデータを流したら詰まった

概要 heroku run rails db:seedを実行したらエラーが起きた。 結論 古い本番環境のデータが残っていたのが原因。 それまでの過程 ➀Herokuへログイン $ heroku login --interactive ➁Herokuへデプロイして、本番環境でのマイグレーションファイルを生成 $ git push heroku master $ heroku run rails db:migrate ➂初期データ(seed)を流し込む $ heroku run rails :seed はい、ここで詰まります。 ActiveModel::UnknownAttributeError: unknown attribute 'user_area' for User. Userテーブルにuser_areaのカラムがないんだと。 ここでschema.rbを確認。すると… create_table "users", force: :cascade do |t| t.string "name" t.string "email" t.integer "user_area" t.integer "user_job" t.integer "school_year" t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false t.string "password_digest" t.string "remember_digest" t.boolean "admin", default: false t.string "activation_digest" t.boolean "activated", default: false t.datetime "activated_at" t.string "avatar" t.string "reset_digest" t.datetime "reset_sent_at" t.string "profile" t.index ["email"], name: "index_users_on_email", unique: true end はあ?あるやん! じゃあ今の本番環境のUserテーブルどうなってんの? ってことで heroku run rails c すると、Railsチュートリアルを走らせていた時の古いデータが。。 そこにはuser_areaのカラムがない。 なので、$ heroku run rails db:resetを実行。 データをすっきりさせてからもう一度$ heroku run rails db:seedを実行。 そしたらseedが通りました。 でもこれだとアプリをアップデートしてカラムを増やしたときにまた同じことが起こる。 それまでに登録していたユーザーが消えてしまう。。 他にも良い方法があればコメントで教えてください。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【rails】ログインユーザーに一回だけ回答させる (サンプル例)

ログイン、質問投稿、投稿に対する回答ができるアプリがある。 各ユーザーが各質問に対して一回だけ回答できるように設定したい 1.モデル ユーザーを表すmemberモデル、投稿した質問に関するpostモデル、 質問に対する回答を表すanswerモデルがそれぞれある。 各モデルの関係は以下 app/models/answer.rb class Answer < ApplicationRecord belongs_to :member belongs_to :post end app/models/post.rb class Post < ApplicationRecord has_many :answers, dependent: :destroy belongs_to :member end app/models/member.rb class Member < ApplicationRecord has_many :answers, dependent: :destroy has_many :posts, dependent: :destroy end 2. コントローラーファイル post,answerのコントローラーについては以下 app/controllers/posts_controller.rb class PostsController < ApplicationController def index # 質問一覧を表示する画面 @posts = Post.all end def show # 投稿内容、と回答内容をまとめて見れる画面 @post = Post.find(params[:id]) # 現ログインユーザーが一回既に回答してたらそれ以上回答できなくする @answer = Answer.find_by(post_id: params[:id], member_id: current_member.id) @answers = @post.answers # postに紐づくanswerを表示させる end def new @newpost = Post.new end def create @newpost = current_member.posts.build(post_params) redirect_to public_posts_path end .... end app/controllers/answers_controller.rb class AnswersController < ApplicationController def new # 新規回答画面 @newanswer = Answer.new end def create # 新規回答作成 @newanswer = Answer.new(answer_params) @newanswer.member = current_member redirect_to public_post_path(@newanswer.post_id) end .... end 3.viewファイル  以下については割愛 ・posts/index.html.erb(質問投稿一覧画面) ・posts/new.html.erb(新規質問投稿作成画面) ・answers/new.html.erb(新規回答作成画面) 以下のようなposts/show.html.erb ファイルを作成することでpostの内容とそれに紐づくanswer内容、answers/new.html.erbへ行くリンクを表示可能  ※answer内のanswerbody等、具体的なカラムについては割愛 app/views/posts/show.html.erb <%= link_to ' 新規回答投稿する', new_post_answer_path(@post) %> <table> (~質問内容表示~) <%= @post.posttitle %> <%= @post.postbody %> .... (~~回答内容を表示~~) <% @answers.each do |answer| %> <%= answer.answerbody %> <%= answer.updated_at %> .... <% end %> </table> 上記ファイルの冒頭に以下のような条件分岐を設けることで 現ログインユーザー(current_member)が既に回答した場合、 新規回答作成画面へのリンクを表示できなくさせることができる。 <% if @answer.blank? %> <%= link_to ' 新規回答投稿する', new_post_answer_path(@post) %> <% end %> さらに以下を付け加えれば、「そもそも非ログイン状態だと回答できない」 <% if member_signed_in? %> <% end %> 「質問を作成したユーザーだと回答できない」 <% if @post.member.id != current_member.id %> <% end %> 等細かい条件を設定可能
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

NuxtとRailsで構築したアプリにローカルでスマホからアクセスする

はじめに NuxtとRails APIで開発してる時にスマホで動作確認したい時ありますよね。 わざわざステージング環境にデプロイして動作確認するのは一手間。 そこでローカルでスマホからアクセスして動作確認する方法をメモしておきます。 Dockerを使って環境構築しており、PCとスマホを同じWiFiに接続していることが前提です。 僕はMacとiPhoneを利用するので端末がこれらと異なる場合はご自身で対応してください。 注意事項 同じネットワークを利用している端末だったらアクセスできてしまうため、カフェなどFree Wi-Fiなどでは避けること。 設定していく 1.IPアドレスを確認する システム環境設定→ネットワークを開きます。 すると以下の画像の青線のようにプライベートIPアドレスがわかるのでコピーしておきましょう。 この例では192.168.11.9です。 2.Nuxtの設定 package.jsonの"dev": "nuxt"以下に変更します。 僕は8080番ポートを使っているのでご自身のポート番号に置き換えてください。 IPアドレスも先ほどメモしたご自身のものに置き換えましょう。 package.json "scripts": { "dev": "NUXT_HOST=192.168.11.9 NUXT_PORT=8080 nuxt" } 続いてaxiosの設定です。 僕の場合はbaseURLがlocalhostになっています。 このままだとスマホでアクセスしてRails側にリクエストを投げる際、スマホ自身の3000番ポートを参照してしまいます。 なので先ほどメモしたIPアドレスとRails側のポート番号に変更します。 僕はRailsのデフォルトである3000番ポートを使っていますが、ご自身のものに置き換えてください。 front/plugins/axios.js //削除 config.baseURL = 'http://localhost:3000' //追加 config.baseURL = 'http://192.168.11.9:3000' 3.Railsの設定 corsでhttp://192.168.11.9:8080を許可します。 corsの設定は他にもやり方もあるので下記通りではうまくいかないかもしれませんが、許可するオリジンにhttp://192.168.11.9:8080を追加すればOKです。 development.rb # 削除 config.allow_origins = ['http://localhost:8080'] # 追加 config.allow_origins = ['http://localhost:8080', 'http://192.168.11.9:8080'] これでhttp://192.168.11.9:8080(自分のIPアドレスとポート番号に変更する)にスマホでアクセスできると思います。 動作確認が終わったらファイルの変更を元に戻しましょう。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む