Heroku + rails4.2 + Deviseで本番環境,ログアウト画面に遷移する際にエラー

投稿者: Anonymous rails4.2 + Deviseで,本番環境のみで発生するエラーです. rake assets:precompile でプリコンパイル後に git push heroku master で立ち上げると,ログイン画面が表示されるところまでは確認しました. ログイン後,ログアウトを図ると The page you were looking for doesn’t exist. You may have mistyped the address or the page may have moved. If you are the application owner check the logs for more information. というエラーが吐かれてしまいます. こちらがGemfileの一部抜粋になります. # Bundle edge Rails instead: gem ‘rails’,…(Continue Reading)

rails (ruby) で forever 的なことがやりたい際のベストプラクティス

投稿者: Anonymous バックグラウンドのバッチ処理を rails (のサブセット: ActiveRecord などのみ使う) で記述しています。結果、 Application#load_tasks により bundle exec rake コマンドでバッチをコマンドで実行できる状態になっていたとします。 この時に、バッチのメインループを、失敗しようが成功しようが、ある一定のインターバルを挟んだ上で、ひたすらループしたいと考えています。これは、どう実現するのがベストでしょうか? 似たようなことを実現する上で、有名なツールとして whenever がありますが、これは cron による定期実行をサポートするツールであって、「秒単位でインターバルを指定しながらひたすらループしたい」という今回やりたいことは満たせないと思っています。 また、同じ系統のツールたちに、 もろもろの job queue (active_job でサポートされるような) がありますが、 redis を前提としているものが大半であったりして、わりと、オーバーキルな気がしています。 運用でどうにかするという観点では、現在では以下のように tmux session と shell script を組み合わせています。 tmux new-session -s セッション名 -d ‘while true; do 実行したいコマンド; sleep インターバル; done’ ただ、この方法は、なんというかあまり rail にのっかっていないというか、ちょっと気をつかわないと上手く動かなかったりするので、これをよろしくやってくれるライブラリなどがあれば知りたいな、と思っています。 解決 対象のバッチ処理を Sidekiq のジョブとして定義したのちに、…(Continue Reading)

Rails4でRansackを用いた検索にて複数のカテゴリ全てに所属するレコードを検索したい

投稿者: Anonymous Rails4を使ってホテル検索システムのようなものを作成しています。 そしてこのシステムの検索機能として、特定の設備を持つ(複数選択可)ホテルを検索して表示する、といったことをRansackを使って実装しようとしています。 例えば、検索画面にて「大浴場」、「レストラン」、「売店」などのチェックボックスを用意してチェックしてもらい、検索するようなシステムです。 ここで問題なのですが、「大浴場」、「レストラン」、「売店」全てにチェックボックスにチェックして、これら3つ全てを持つホテルのみを検索させることができておりません。 3つ全てにチェックしても、3つの内いずれかを持つホテルが表示される状況です。 どのようにしたら解決できるのか、ご教授頂きたいです。 またそもそも前提がおかしいなどありましたらご指摘頂きたいです。 詳細を以下に記載致します。 app/model/hotel.rb # == Schema Information # # Table name: hotels # # id :integer not null, primary key # name :string(50) not null # ホテル名 # address :string(50) not null # ホテル住所 # created_at :datetime # updated_at :datetime class Hotel < ActiveRecord::Base has_many :equipments, dependent:…(Continue Reading)

ruby 2.6.1, rails で `You must use Bundler 2 or greater with this lockfile` がでます

投稿者: Anonymous ruby 2.6.1 rail 5.2.2 bundler 2.0.1 で rails をインストールしていたところ、 bundle install は実行できるにもかかわらず、ありとあらゆる rails コマンドが You must use Bundler 2 or greater with this lockfile. とエラーを出力します。これはどうやったら対処できますか? 解決 これが原因の様子です。 https://bugs.ruby-lang.org/issues/15582 ruby 自体が bundler を内部に含むようになり、それが、 bundler 1.17.2 のバージョンを固定で利用するために生じているバグの様子です。 2.6(.1?) から発生しているバグであること すでに closed でそのうち patch リリースされるであろうこと を考えると、 2.6.2 がリリースされるまでは、 ruby 2.5.3 を利用する方が良さそうです。 FWIW 2.6.1 をどうしても使いたい場合は、以下の対応でどうにかなるっぽいです。 https://stackoverflow.com/a/54189640/3090068 回答者:…(Continue Reading)

Railsで入力したグループ名が未存在なら新しいグループを、存在すれば既存のグループをユーザーに関連づけたい

投稿者: Anonymous – User – id – name – group_id – Group – id – name このようなモデルがあります。 ユーザーのフォームに「グループ名」というテキストフィールドを用意して、 その中にユーザーが入力したグループ名が存在すれば、そのグループとひも付けて、 存在しない場合はグループを新規作成してから紐付けるというフォームを作りたいのですが、 どのように作るのがrailsらしいのでしょうか。 ご教示お願いします。 解決 Userクラスにgroup_nameという属性を追加し、before_saveでGroupを検索、なければ作成、というようにするのが良いかなと思います。 class User < ActiveRecord::Base belongs_to :group attr_accessor :group_name validates :name, presence: true before_save :find_or_create_group def find_or_create_group if group_name.present? self.group = Group.find_or_create_by!(name: group_name) else self.group = nil end end end フォームではUser#group_nameを編集できるようにします。 <%=…(Continue Reading)

rails5.1で、即時500エラー終了したい

投稿者: Anonymous GET引数が仕様通りではない→クラック開始だ→即拒否、 を実現するため、 phpでの header(‘HTTP/1.1 500 Internal Server Error’); exit; と同様のことを、 rails5.1のcontroller内で行おうとして、 if @entry.blank? render text: “error” throw(:abort) end と書いてみたのですが、意図通り即時終了になってくれません。 rails5.1で実現可能でしょうか? 2017-12-11追記 (コメント欄だとコードブロックが使えず改行も効かない為、ソースコード載せるのが不可能でした) rails 5.1 の rails generate scaffold entry title:string body:integer が生成する app/controllers/entry_controller.rb は、以下のように、 「EntriesController.set_entry で @entry を取得する」 ようになっていまして、 (それ以前のバージョンの動きはわかりません。rails入門してまだ一週間経ってないので…) そこで throw(:abort) しても効果が無い、という話でした。 app/controllers/entry_controller.rb class EntriesController < ApplicationController before_action :set_entry, only: [:show, :edit,…(Continue Reading)

Deviseで保存されたUserの暗号化パスワードと入力パスワードの同値確認方法は?

投稿者: Anonymous DeviseでUser管理をしています。保存されたパスワードはencrypted_passwordとして暗号化されて保存されています。 Deviseのログイン画面とは別にDeviseを使わないログイン画面を作る必要が出てきました。 パラメータから受け取ったparams[:password]と既にDeviseのsign_upから登録済のUserのencrypted_passwordが同値であるか(ログインが許可できるか?)はどう判断すればいいのでしょうか? 解決 valid_password?メソッドを使ってください。 以下は実行例です。 user = User.find_by_email(params[:email]) user.valid_password?(params[:password]) 参考: https://stackoverflow.com/questions/4320921/how-verify-user-password-in-devise 回答者: Anonymous

Rspec+GuardでCarrierwaveを使用していると一時的にハングアップする

投稿者: Anonymous rspecをguardで自動化して実行した際に、Carrierwaveを使用した処理の実行後にrubyプロセスのCPU使用率が数十秒100%近い状態になります。 rails 4.2.0 rspec 3.2.0 guard 2.12.4 guard-rspec 4.5.0 carrierwave 0.10.0 factory_girl 4.5.0 環境は上記の通りです。 通常のコマンドからrspecを実行するとrubyプロセスのCPUの使用率はすぐに終了します。 しかしguardを使用してspecファイルの変更を検出しての実行の際には数十秒間CPUが100%近くなり、処理が止まります(次の変更の検知・実行までタイムラグがある)。 概要は以下のとおりで、 user モデル imageというattributeを持っており、mount_uploader :image, UserImageUploaderとして設定。 carrierwave 設定 CarrierWave.configure do |config| if Rails.env.production? || Rails.env.staging? config.fog_credentials = { ### } config.asset_host = Settings.asset_host config.fog_public = true config.fog_directory = Rails.application.secrets.IMAGE_BUCKET config.storage :fog else config.storage :file end if Rails.env.test?…(Continue Reading)

rails g controller コマンドでアプリケーションディレクトリ外に生成を試みてしまう

投稿者: Anonymous OS: windows8.1 eclipse3.8 ruby 2.1.6 32bit版 Rails 4.1.10 上記環境でローカルで開発を進めています。 eclipse上でrailsプロジェクトを作成し、ターミナルからこのディレクトリ内でrails new . の後、 rails g controller hoge/fuga -helper false -assets false としたところ、下記実行されました。 create app/controllers/hoge/fuga_controller.rb invoke erb create app/views/hoge/fuga invoke rspec create spec/controllers/hoge/fuga_controller_spec.rb invoke helper create app/helpers/api/login_helper.rb invoke rspec create spec/helpers/hoge/fuga_helper_spec.rb invoke assets invoke js create app/assets/javascripts/hoge/fuga.js invoke scss create app/assets/stylesheets/hoge/fuga.css.scss しかし、期待したディレクトリの中に何も生成されていませんでした。 何故かeclipseのインストールディレクトリからのパスに生成を試みたようで、 C:/eclipse/app/controllers/hoge/fuga_controller.rb…(Continue Reading)

RSpec+CapybaraでBootstrap 4のドロップダウンをテストする方法

投稿者: Anonymous 現在、RSpec+Capybaraでテストコードを書こうとしています。 やりたいことはナビゲーションバーの中にあるドロップダウンをクリックして表示されたドロップダウンメニューの中にログアウトというコンテンツがあることを確かめることです。 Viewのコードは下記の通りです。 テンプレートエンジンはslimを、CSSフレームワークはBootstrap 4を使っています。 nav.navbar ul.navbar-left = link_to ‘brand’, authenticated_root_path, class: ‘navbar-brand’ ul.navbar-right li.nav-item.dropdown = link_to ‘☰’.html_safe, ‘http://example.com’, class: ‘nav-link dropdown-toggle’, id: ‘navbarDropdownMenuLink’, ‘data-toggle’: ‘dropdown’, ‘aria-haspopup’: ‘true’, ‘aria-expanded’: ‘false’ .dropdown-menu aria-labelledby=’navbarDropdownMenuLink’ = link_to ‘ログアウト’, destroy_user_session_path, method: ‘delete’, class: ‘dropdown-item’ 次に現状のテストコードは下記の通りです。 feature ‘Navigation links for users’, :devise do scenario ‘view navigation links’ do…(Continue Reading)

bundle install sudoつけない方法

投稿者: Anonymous 現在rails の新規のプロジェクトに対して、bundle installが通らず、何故かsudoをつけると確実に動作するような状況です。 sudoをつけないと There was an error while trying to write to /Users/name/.bundle/cache/compact_index/rubygems.org.443.29b0360b937aa4d161703e6160654e47/versions`. It is likely that you need to grant write permissions for that path. に出てしまいます。 ネット上で参考になるものが見つけられなく、困っています。 どうすれば、sudo無しで、対応できるか教えていただきたいです。 *権限問題かと思って当初権限を見たのですが drwxr-xr-x 23 name name 782 4 27 12:22 project_name 上記のように問題がないようでした。 解決 There was an error while trying to write to /Users/name/.bundle/cache/compact_index/rubygems.org.443.29b0360b937aa4d161703e6160654e47/versions`. It…(Continue Reading)

Railsでpersisted? が true のオブジェクトの値が保存されていない

投稿者: Anonymous RailsでCompanyモデルがあり、has_many QuarterValueという関係を持っています。 そしてCompanyのインスタンスメゾットでQuarterValueの特定の値を一括で変更するという処理をしているのですが、何故か変更がDBに反映されません。 変更後に company.quarter_values.map(&:persisted?) を試すと全てtrueが返ってきます。 またcompany.quarter_values.lastで該当カラムを確認すると値が変更されているのですが quarter_value = QuarterValue.find(company.quarter_values.last.id) で確認すると該当カラムの値は変更されていません。 該当のカラムの型はdecimalで代入しようとしてる値はBigDecimalです。 quarter_value.update(column_name: value) で値を更新すると問題なく行われます。 一体何が問題なのでしょうか? 何か基本的な事を見落としてる気がするのですが、 どう調べれば良いかもわからない状態で困っています。 Rails: 4.2.1 でDBは Postgresql を使っています。 解決 @naopontan さんのアドバイスでreloadを使った所、必要ないインスタンスが生成されていたのでそれを止めて、それから quarter_values.find_each { |q| q.update(foo: nil) } という処理をしてる部分があったので、 quarter_values.update_all(foo: nil) に変えた所、期待通りの処理になりました。 なお quarter_values.each{|q| q.update(foo: nil)} でも問題は発生しませんでした。 回答者: Anonymous

Railsコンテナにおける docker-compose up がエラーとなり起動できない

投稿者: Anonymous 開発環境にDockerを導入してRailsの開発を行いたいのですが、docker-compose up が正常に動作せず、どうすれば動作させることができるかの解決策や、原因として考えられることだけでもご教示いただければと思い、質問させていただきます。 実現したいこと 開発環境にDockerを使用し、Ruby on Railsの開発を行いたい。 そのために、既存のRailsアプリをDockerにて起動し、ブラウザのlocalhostで見れるようにしたい。(既存のRailsアプリはWSLにて動作していました。この度、WSLでなくDockerで開発しようと思い立ちました) 下記のQiita記事を参考に実施しています。 既存のRailsアプリにDockerを導入する手順 丁寧すぎるDocker-composeによるrails5 + MySQL on Dockerの環境構築(Docker for Mac) 使用環境 ツール:Docker Quickstart Terminal VM:VirtualBox(Linux2.6/ 3.x/ 4.X(64bit)) ホストOS:Windows10 Home 現在の状態 1.Docker Quickstart Terminalを起動し、Dockerコマンドを打ち、動作することは確認しています。 2.Dockerfileとdocker-compose.ymlは以下のように記述し、docker-compose build –no-cache は正常に完了できました。その後、docker-compose up を実行したところでエラーが出ています。 <エラーメッセージ> web:Could not locate Gemfile or .bundle/ directory と表示後、    exited with code 10と表示されました。 3.webのみエラーが出ている様子です。調査中ですが、調べる時間があまりに長時間かかっているため、質問させていただいた次第です。(DBコンテナは起動しているようです) ※ホスト側のRailsアプリのディレクトリ C:mydevmyfavrest-app ※ターミナル起動時のカレントディレクトリ…(Continue Reading)

railsでページ読み込み時に毎回スクリプトを実行したい

投稿者: Anonymous 文字のカウント数を表示するcoffescriptのプログラムなのですが、 ブラウザの再読込を行なった際にしか実行されません。 $(document).on ‘ready page:load’, -> thisValueLength = $(‘#comment’).val().length; $(‘#count’).html(thisValueLength); ページ遷移時等に毎回実行する方法はないのでしょうか。 よろしくお願いいたします。 解決 page:load イベントが発火していないので、Rails 5 (Turbolinks 5) を利用しているのだと思います。このバージョンでは、turbolinks:load を利用する必要があります。 回答者: Anonymous

RailsでCSRF対策しているのにMass Assignment対策をする意味

投稿者: Anonymous Rails等のWebアプリでCSRFとMass Assignmentの両方に対策する必要があるのでしょうか。 CSRF対策さえできてれば、正当なFormからのデータ送信=Mass Assignment対策不要と考えました。Strong Parametersで全データを無分別にpermitした場合(もちろんCSRF対策は行う)、どんな問題が生じますか。 解決 CSRF攻撃は悪意を持った人物がわなを仕掛け、そのわなを踏んだ正規ユーザーに普通のリクエストを送らせるというものです。例えば「リンクを踏むだけで特定の文言がツイートされてしまう」といったものです。ですから、正しいページ遷移かどうかを検証します。 一方 Mass Assignment は、ユーザーから送信された値をデータベース等に保存するという処理において、求めていないデータが送られてきても一緒に保存してしまうという問題です。本来ユーザーには書き換えさせない列まで書き換えられてしまいます。 ではページ遷移が正しければ、Mass Assignment が行われる可能性はないと言えますか?関係ないですよね。正当なFormを開いて、ブラウザの開発者ツールでinputを追加して、送信ボタンを押すだけで Mass Assignment を利用した攻撃は成立します。 回答者: Anonymous

Rails Action Mailerで送信した人と管理者の両方にメールを送る方法

投稿者: Anonymous お問い合わせを受け付けた時にお問い合わせをした人とシステム運営者の両方に自動で受領メールを送付したいです。どのようにしたら送信できるでしょうか? お問い合わせした人に送るメール文言とシステム運営者に送る文言は異なります。 ユーザに送信 class InquiryMailer < ActionMailer::Base default from: “[email protected]” def received_email(inquiry) @inquiry = inquiry mail to: “[email protected]”, subject: “webサイトからお問い合わせがありました。” end def thanks_email(inquiry) @inquiry = inquiry mail to: inquiry.email, subject: “【maimai】お問い合わせを受け付けました” end end 解決 received_email メソッドはお問い合わせした人(ユーザ)宛てですよね? そのメソッドとは別に「システム運営者宛に送信するメソッド」を作成します。 後はメール送信のタイミングで上記2つのメソッドをコールすれば良いと思います。 回答者: Anonymous

Rails で既存のテーブルをモデル化したい

投稿者: Anonymous Rails を今日から勉強し始めました MySQL に memo というテーブルがあったときに Rails で一覧画面と詳細、更新画面をつけて web UIから更新できるようにしたいなと思ってます rails g model memo ってやるとなんかいろいろファイルが作られて rails s -b 0.0.0.0 をやったときに ActiveRecord::PendingMigrationError ( Migrations are pending. To resolve this issue, run: rails db:migrate RAILS_ENV=development ): というエラーが出るようになりました エラーの意味がよくわからないのですがこれはどういうエラーなのでしょうか 解決 未実行のマイグレーションが残ってるのでマイグレーションを実行してくださいっていうエラーです 普通ならそこに書いてる rails db:migrate RAILS_ENV=development を実行すれば解決すると思いますが マイグレーションというのは db/migrate/ 以下にあるファイルのことで Railsで使うモデルのテーブルを定義すれば勝手に管理してくれます rails g model を行うと勝手にテンプレートを作ってくれるものなのですが Rails 外や手動でテーブルを作成した場合はマイグレーションは不要なので消してしまっていいです…(Continue Reading)

Couldn’t find with ‘id’の解決方法(ショッピングカート機能の実装)

投稿者: Anonymous 現在RailsでECサイトを作成中です。 カート機能を実装したいのですが、「カートに追加」のボタンをクリックすると、以下のエラーが発生します。 LineItemが判別できないというエラーと認識しております。 application.controller.rbに include CurrentCart before_action :set_cart  の記述を追加しましたが、変化はありませんでした。 また、「カートに追加」のパスにはidも渡しております。 binding.pryで検証したところ、 @line_itemの値はnilとなっておりました。 解決方法の見当がつかず、情けないですが何卒お力添えの程宜しくお願い致します。 Error message ActiveRecord::RecordNotFound at /line_items/2 Couldn’t find LineItem with ‘id’=2 line_items.controller class LineItemsController < ApplicationController include CurrentCart before_action :set_line_item, only: [:show, :edit, :update, :destroy] before_action :set_cart, only: [:create] def index @line_items = LineItem.all end def show end def new @line_item…(Continue Reading)

ActiveRecordで複数の関連を持つcollectionに対する追加の方法

投稿者: Anonymous ActiveRecordで複数の関連を持つcollectionに、新たなレコードを追加させたい場合の実装について悩んでいます。 まず、テーブル構成を示します。 テーブル users … ユーザの情報を保持するテーブル entries … 記事の情報を保持するテーブル laters … “あとで読む”に設定した記事とユーザを紐付ける中間テーブル checks … “既読”に設定した記事とユーザを紐付ける中間テーブル アソシエーション user → laters → entrys ※ userはlatersを中間テーブルとしてhas_many: entriesな関連を持つ user → checks → entrys ※ userはchecksを中間テーブルとしてhas_many: entriesな関連を持つ 質問 下記のように既読記事の追加(user-check-entryの紐付けの追加)の実装を行ったのですが意図どおりに動きません。 entry = Entry.new : entry.save User.find(1).entries<<entry 意図するところは、checksテーブルに紐付けのレコードがinsertされることですが、実際にはlatersテーブルにinsertされてしまいます。 複数の関連を持つcollectionに、明示的に「こっちの紐付けを追加」というような操作はできますでしょうか。 ソースコード Github https://github.com/hogesuke/tech-book/tree/master/model 解決 質問のアソシエーションの記述から、User モデルは以下の様な記述を試されたと仮定して話を進めます。 (前提が違っていたら申し訳ありません。) class User < ActiveRecord::Base…(Continue Reading)

Ruby on Railsでサーバー起動後と停止前に処理を書く場合のベストプラクティスを教えてください。

投稿者: Anonymous Ruby初心者です。 いくつかのWebアプリケーションフレームワークでは、サーバー起動後(boot時)や停止前(Ctrl+Cを押された場合など)にユーザーのカスタム処理を書くフックポイントが用意されていると思いますが、 Ruby on Railsで同様のことがしたい場合のベストプラクティスはありますでしょうか? 以下のサイトなどを見るとできそうではありますが、あまり正式な方法ではないように思います。 http://guides.rubyonrails.org/initialization.html 複数サーバーでのスケールアウトが主流の世の中で、サーバーインスタンスの起動、停止にフックして処理すること自体、あまり必要性がないのかもしれませんが、参考までに質問です。 解決 コメントより 起動通知だけなら config/initializers配下でも良いと思いますが。 残念ながらconfig/finalizersのようなものがありません。 ベストプラクティスというのは、なかなか難しいものですが。 私の場合は、よくこういうrakeタスクを書きます。 [lib/tasks/server.rake] namespace :server do desc ‘[auto-pilot] Server Start’ task start: :environment do # ここにサーバー起動前処理 ` ここに サーバー起動コマンド ` end desc ‘[auto-pilot] Server Stop’ task stop: :environment do # ここにサーバー終了前処理 ` ここに サーバー終了コマンド ` end end $ rake server…(Continue Reading)

RSpecの特定のテストの時にだけbinding.pryで動作を確認する

投稿者: Anonymous RSpecのテスト中にbinding.pryで変数の状態などを確認できるようにpry-byebugを入れて使ってみたのですが、binding.pryを入れておいたメソッドが複数のテストから呼ばれていると、そのテストのたびに全て止まってしまい、何度もexitを入力しなければすべてのテストを終えれませんでした。 特定のテストでだけbinding.pryを有効にするにはどうすればよいのでしょうか? 以下に例を示しておきます。 Classファイル class Post def foo binding.pry # do something return nil end def bar # foo を呼び出して何かする end end Specファイル let(:post){ Post.create } describe “.foo” do it do expect(post.foo).to be nil end end describe “.bar” do it do expect(post.bar).to be 1 end end この時に一つ目のテストではbinding.pryで止まるけども、2つ目のテストでは止めずに処理を続行させたいと思っています。 解決 特定のテストだけを実行するとよいのではないでしょうか。 describe “.foo”, focus: true…(Continue Reading)

Railsのsubmitの2重送信を避ける方法disable_withの書き方がネット上に2パターンあるがどこかのバージョンで仕様変更がありましたか?

投稿者: Anonymous Railsのsubmitに付与するdisable_withですが submit(data: {disable_with: “文字”}) の形と submit(disable_with: “文字”) の2パターンをネット上で見かけるのですが、どこかのバージョンで仕様が変わりましたでしょうか?Rails4だと前者が正しいと考えています。 解決 3.2.4 と、 rails/CHANGELOG.md at 3-2-stable · rails/rails Deprecate :disable_with in favor of ‘data-disable-with’ option for button_to, button_tag and submit_tag helpers. 4.0.0 で 変更されたみたいですよ。 rails/CHANGELOG.md at 4-0-stable · rails/rails Deprecate :disable_with in favor of data: { disable_with: “Text” } option from submit_tag, button_tag and button_to…(Continue Reading)

検索結果が一件の場合のみURLを個別ページの物に変える

投稿者: Anonymous Railsで検索機能をつけたかったので以下のようにsearchをコントローラに追加して 検索結果が0件ならエラー表示、一件なら個別、複数件なら indexを表示するようにしています。 app/controllers/companies_controller.rb def search @companies = Company.search(params[:search]).page(params[:page]) end app/views/companies/search.html.erb <%= render ‘search_error’ if @companies.count == 0 %> <%= render ‘show’, company: @companies.first if @companies.count == 1 %> <%= render ‘index’, companies: @companies if @companies.count > 1 %> ここで個別ページを表示する時はURLをshowの時と同じ個別のものに変えたくなったのですが、 その場合はやはりcontroller側に分岐処理を書くことになるのでしょうか? ただそうしても redirect_to を使うと再取得で無駄な処理が走ってしまうし、 うまい方法が思いつかず困っています。 このような場合に一般的な処理などはありませんか? 解決 一般論としては、Controllerで redirect_to を利用して個別ページにリダイレクトするべきだと思います。 そのままのURLで個別ページを表示した場合、将来的にそのそのURLで個別の情報が表示されない (検索結果が2件以上になる) 可能性があり、URLが示すページの内容が異なってしまうためです。(ブックマークやリンクした場合に混乱を招く可能性があります。)…(Continue Reading)

undefined method `update’ for nil:NilClass エラーが出て解決できない

投稿者: Anonymous 前提・実現したいこと ※cloud9を開発環境としてつかっています。 現在簡単な投稿のアプリをRailsで作っているのですが、 すでに投稿されたものを修正する機能を追加しようとしたときに 編集をすると undefined method `update’ for nil:NilClass というエラーが出てしまい、編集が完了できません。 発生している問題・エラーメッセージ undefined method `update’ for nil:NilClass 追記: id:12のデータを投稿後に編集するようにしたいので コメントいただいたようにデータが入っていないのかな?と見たところ 2.6.0 :004 > Article.find(12) Article Load (0.2ms) SELECT “articles”.* FROM “articles” WHERE “articles”.”id” = ? LIMIT ? [[“id”, 12], [“LIMIT”, 1]] => #<Article id: 12, title: “testing article”, description: “this is a test”,…(Continue Reading)

railsでサーバーが立ち上がらず、sassc でエラーが出る: cc1plus: error: unrecognized command line option “-std=c++11”

投稿者: Anonymous Rails でターミナルにてサーバーを立ち上げようとするのですが エラーが下記のように出て立ち上げることができません。 Could not find gem ‘sqlite3 (~> 1.3.6)’ in any of the gem sources listed in your Gemfile. Run bundle install to install missing gems. 不思議なのが上記の操作をしても continue. Make sure that gem install sassc -v ‘2.3.0’ –source ‘https://rubygems.org/’ succeeds before bundling. と出て gem install sassc -v ‘2.3.0’ –source ‘https://rubygems.org/ を実行し、そのあと bundle install…(Continue Reading)

Activerecordの更新のメソッドを使っているのに、idがuniqueではないYOと出る。

投稿者: Anonymous product = <Item id: 4, url: nil, memo: nil, created_at: “2015-11-07 09:48:36”, updated_at: “2015-11-07 09:48:36”, Totalweight: 390.0, Perweight: nil, price: 1000> attr = {“id”=>4, “tag_list”=>”peanuts”, “price”=>1000, “url”=>nil, “Totalweight”=>390, “memo”=>nil} で、 product.update!(attr) ないしは、 product.update_attributes!(attr) で、activerecordを更新しようとしていますが、 SQLite3::ConstraintException UNIQUE constraint failed: items.id !! #<ActiveRecord::RecordNotUnique: SQLite3::ConstraintException: UNIQUE constraint failed: items.id: INSERT INTO “items” (“id”, “price”, “Totalweight”, “created_at”, “updated_at”,…(Continue Reading)

ActiveRecordでgroupしたクエリを集計してviewに表示する

投稿者: Anonymous 著者(Author)毎に記事(Article)をグループ化し、 それを記事一覧に 記事数として表示しようとしています。 記事一覧 |著者ID|著者名|記事数| |—–|———-|——–| | 1| AAA| 1| | 2| BBB| 10| | 3| CCC| 5| ArticlesController @articles = Article.all.group(:author_id) ~~~ 略 ~~~ @articles = @aticles.page(params[:page]).per(20)) index.html.erb <% @articles.each do |article| %> <tr> <td><%= article.author.id %></td> <td><%= article.author.name %></td> <td><%= article.???????????? %></td> </tr> <% end %> 記事のグループ化は出来たのですが、記事数を表示する方法がわかりません。 Article.all.group(:author_id).countのように.countを使ってみましたが 著者IDと記事数のハッシュが返って来てしまうため その後のページネイションがうまく行かなくなります。 また、.sumで集計するカラムはスキーマに追加していません…(Continue Reading)

エラーが取れないです。No route matches [PATCH] “/articles/1/comments”

投稿者: Anonymous 記事についたコメントを編集出来るようにしたいのです。 コメントをformに持っていき編集して更新ボタンをクリックすると No route matches [PATCH] “/articles/1/comments” のようなエラーが出てきてrotesなどを色々変えて見たのですが全然、治らないので見ていただけないでしょうか? _form.html.erb <%= form_for(comment, url: article_comments_path) do |f| %> <% if comment.errors.any? %> <div id=”error_explanation”> <h2><%= pluralize(comment.errors.count, “error”) %></h2> <ul> <% comment.errors.full_messages.each do |message| %> <li><%= message %></li> <% end %> </ul> </div> <% end %> <div class=”field”> <%= f.label :content %> <%= f.text_area :content %>…(Continue Reading)

railsで子テーブルの値をviewから使える方法

投稿者: Anonymous Ruby on Railsで開発をしています。 現在開発しているものには4つのモデルがあります。 これらを各自A, B, C, Dだとした時にこれらの関係は BがAを参照、CがBを参照、DがCを参照しています。 私がしたいのはAテーブルをviewでリストに表示する時にカラムを一個追加し、 Aの各IDが持っているDを全部カウントした数値を表示させたいんです。 どうしたらAのリストで各行が持っているDをカウントして表示できるか教えてください。 解決 class ModelA has_many :model_bs end class ModelB belongs_to :model_a has_many :model_cs end class ModelC belongs_to :model_b has_many :model_ds end class ModelD belongs_to :model_c end ということでしょうか? 色々やりようはあると思いますが、 model_a の id を キーにした hash に、カウントを保存して使う。 などはどうでしょうか? コントローラで、ハッシュを作り model_a_list = ModelA.all model_a_ids_model_d_sizes =…(Continue Reading)

Ruby on Rails で before_actionの中に定義した変数をアクションの中でも使いたい

投稿者: Anonymous before_actionの中で値を設定した変数をアクションの中でも使う方法ってありますか? たとえば、before_actionにhogeを指定した状態でhugaを呼び出した時、 before_action :hoge def hoge val = “abc” end def huga puts val end abc となるのを期待しているのですが、そもそも出来るんでしょうか? クラス変数を使うのが素直? 解決 できません。インスタンス変数を使うのが最も簡単です。 before_action :hoge def hoge @val = “abc” end def huga puts @val end 処理した内容をメモ化しておいてメソッド名でアクセスする方法もあります。 before_action :hoge def hoge @val ||= “abc” end def huga puts hoge end before_actionで一度hogeはよばれていますが”abc”は一度しか生成されません。 回答者: Anonymous