この処理をrubyらしく処理する方法を教えて下さい

投稿者: Anonymous [ [“てつお”, “名前”], [“男”, “性別”], [“23歳”, “年齢”], ] ↓ { “名前” => “てつお” “性別” => “男” “年齢” => “23歳” } phpしか使ったことしかなく、mapやeachなどを使って上記の処理をする方法がわかりません。 data.map{|d| { d[1] => d[0] } } こうすると 配列の中にハッシュが格納される形になってしまいうまく行きませんでした。 追記 data.map{|d| [d[1], d[0]] }.to_h とすることで出来ました。 このコードは普段からrubyを扱っている方でもわかりやすいコードとなっていますでしょうか。 もう少し一般的な書き方があればおしえてください。 よろしくお願いします。 解決 map を次のように書き換えるとシンプルになります。(これは、map { |x| x.reverse } と等価です) data.map(&:reverse).to_h Hash#invert を利用する方法もありますが、パフォーマンスが落ちるかもしれません。(極端に大きなデータだったり、繰り返し利用されない限り無視できる程度だと思いますが。) data.to_h.invert 回答者: Anonymous

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)

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)

隣り合う2数の差は3以上、1つおいた数との差も3以上の順列は何通りあるか?

投稿者: Anonymous 次の問題を考えています。 (http://www004.upp.so-net.ne.jp/s_honma/mathbun/mathbun113.htm) 1からNまでのN個の整数で、  ア)隣り合う2数の差は3以上、1つおいた数との差も3以上  という条件を満たす順列は、何通りあるだろうか? ただし、順番を逆にしたものもそれぞれ1つずつ数えるものとします。 (より一般的には次のような問題です。 1からNまでのN個の整数で、  イ)隣り合う2数の差はD以上、1個おいた数との差もD以上、… 、D – 2個おいた数との差もD以上  という条件を満たす順列は、何通りあるだろうか? 例えば、N = 9、D = 3 のとき、 [3, 6, 9, 2, 5, 8, 1, 4, 7] [7, 4, 1, 8, 5, 2, 9, 6, 3] の2通りあります。) この問題の答えを速く求めるコードを考えてください。 以下、答えを求めるのが大変遅いコードです。 N = 11 D = 3 def check(a, i) j = 1 d_max…(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

配列から特定式で表したインデックスの要素だけを抜き出す方法

投稿者: Anonymous 例えばインデックス表す式を3n-2としたときに、その式に適合するインデックスの要素だけを配列から抜き出したいといった場合があります。 (概念的にはこんな感じ) [a,b,c,d,e,f,g] => [b,e] ※ 1 <= n <= 2 のとき 最初は以下のようなものを考えてみたのですが、これだとnの範囲をあらかじめ分かっていないと使えません。 a = [:a, :b, :c, :d, :e, :f, :g] b = [] 1.upto(2){|n| b << a[n * 3 – 2]} #=> 1 b.compact #=> [:b, :e] 泥臭いやり方でも、スマートなやり方でも、どちらでも良いので、nの範囲をあらかじめ考えずともできる方法を探しているのですが思いつきません。 言語リファレンスを見ながら考えてはみたのですが、試しているうちに混乱してしまいました。 初歩的な質問かもしれませんが、どなたか良い解法がありましたら教えてください。 解決 @BLUEPIXY さんとほぼ同案ですが、.with_index を使ってもう少しシンプルに。 b = a.select.with_index { |x, i| i%3…(Continue Reading)

Ulam number の効率の良い求め方について

投稿者: Anonymous Ulam number とは以下の性質を持つ数である。 (http://en.wikipedia.org/wiki/Ulam_number) ①今まで現れた相異なる2つの Ulam number の和で表そうとしたとき、1通りしか出来ない。   注)相異なる2つの Ulam number の和で表せないときは、Ulam number ではない。 N = 339 とし、 N 以下の Ulam number を次のように求めてみた。 N = 339 ary = [1, 2] (3..N).each{|i| cnt = 0 (0..ary.size – 2).each{|j| break if ary[j] + ary[j + 1] > i (j + 1..ary.size – 1).each{|k| l…(Continue Reading)

Ruby gemspecのバージョン指定記述方法

投稿者: Anonymous Gemfileやgemspecのバージョン固定、指定の記述方法について。 ~>などの記述方法の意味はウェブ上でもいくつか解説がありましたが、 1点しっくりこないものがあるので教えていただきたいです。 あるgem(https://github.com/rpush/rpush)のgemspecの記述です。 s.add_runtime_dependency ‘multi_json’, ‘~> 1.0’ s.add_runtime_dependency ‘net-http-persistent’, ‘< 3.0’ s.add_runtime_dependency ‘net-http2’, ‘~> 0.14’ s.add_runtime_dependency ‘activesupport’ s.add_runtime_dependency ‘thor’, [‘>= 0.18.1’, ‘< 2.0’] s.add_runtime_dependency ‘railties’ s.add_runtime_dependency ‘ansi’ この、’net-http-persistent’, ‘< 3.0’箇所は、バージョン3.0を含むのでしょうか? 実際、rpushをインストールするとnet-http-persistentは3.0.0でインストールされるので含まれるのでしょうが、表記方法との意味合いがしっくりきません・・・ 「< 小なり」に関する解説記事が見つけられずモヤモヤしています。 よろしくお願いいたします。 追加補足) Rpushのissueで< 3.0では3.0.0は含まれないのでgemspecの記述は正しいが、 何かの理由で3.0.0が含まれてしまうようです。ということは記述はやはり「3.0未満」? https://github.com/rpush/rpush/issues/327 解決 2017/3/3時点で source ‘https://rubygems.org’ gem ‘rpush’ という内容の Gemfile を使って bundle すると rpush 2.7.0…(Continue Reading)

Rubyで濁点を分離したい

投稿者: Anonymous Rubyでひらがなから濁点を分離したいと考えていますがどのような実装が考えられるか教えていただけませんでしょうか? 例 a = remove_dakuten(‘だ’) puts a # た゛ 解決 Unicodeっぽく処理をするのであれば、NFD正規化で濁点を分離できます。 “だ”.unicode_normalize(:nfd) #=> 「た」+U+3099 ただし、この分離された濁点文字(U+3099)は前の文字と結合するための特殊な文字なので、通常の濁点文字(U+309B)にしたい場合は次のように変換すればいいと思います。 “だ”.unicode_normalize(:nfd).tr(“u3099”, “u309b”) #=> 「た」+「゛」 半濁点も同様にするにはこんな感じで。 “ぱ”.unicode_normalize(:nfd).tr(“u3099u309a”, “u309bu309c”) #=> 「は」+「゜」 回答者: Anonymous

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)

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)

ruby でクラス名の先頭に :: がつくときの意味について

投稿者: Anonymous Chefの情報を探していると ::Chef::Recipe.send(:include, Foo::Helper) という表記のものに出合ったのですが、クラス名の先頭に::をつけるとどのような効果になるのでしょうか? ドキュメントを探してみたのですがうまく検索する方法がわかりませんでした。 解決 先頭の::の意味については http://docs.ruby-lang.org/ja/2.0.0/doc/symref.html#colon に説明があります。 ::DateTime 定数のスコープ演算子で、トップレベルの定数であることを示す。 定数の名前解決はクラス・モジュールの内側から外側に向かって行われます。 A = “::A” class Foo A = “Foo::A” class Bar A = “Foo::Bar::A” p A # => “Foo::Bar::A” p Foo::A # => “Foo::A” p ::A # => “::A” end end Barクラスの中からAを参照する場合、何も指定しない場合はいちばん内側にあるFoo::Bar::Aが探索されます。 Foo::Aのようにクラス名を先頭につけることで外側の定数を参照できますが、トップレベルのAはクラス内にありません。 このような場合に::だけを先頭につけることによって一番外側のAを参照することができます。 回答者: Anonymous

Hash[[[1,2],[3,4]]] のようなHashの挙動はどのように解釈すればいいですか?

投稿者: Anonymous 先日activesupportのObject#instance_valuesメソッドのソースコードを読んでいたら Hashについてわからないことがあったので質問させていただきます. Hash[] #=> {} Hash[[]] #=> {} Hash[[[]]] #=> invalid number of arguments Hash[[[1,2],[3,4]]] #=> {1=>2, 3=>4} 上に挙げたこれらのコードの挙動を教えていただけますでしょうか. 下記はactivesupportのObject#instance_valuesのソースコードです. def instance_values Hash[instance_variables.map { |name| [name[1..-1], instance_variable_get(name)] }] end https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/object/instance_variables.rb 解決 該当する部分は Hash.[] と思われます。 .[](key, value, …) ⇒ Object .[]([ [key, value)) ⇒ Object .[](object) ⇒ Object Creates a new hash populated with…(Continue Reading)

Rubyで文字列の式展開を後から行うには?

投稿者: Anonymous 例えば、なんらかの名前を受け取り、その名前に対して挨拶するようなクラスとして、以下のようなものを定義したとします。 class SimpleGreeting def initialize name @name = name end def say “Hello, #{@name}” end end このとき、sayの内部にある文字列を変えることができれば、もっと柔軟な挨拶ができるのではないか、と思いました。しかし、最初に文字列を渡して、あとから式展開を行うスマートな方法がわかりません。それに近い挙動は再現できたのですが、とてもスマートとはいえない気がします。 class Greeting def initialize name, template @name = name @template = “”#{template}”” end def say eval <<-EOF name = ‘#{@name}’ #{@template} EOF end end このようなクラスを定義してあげれば、確かに下のように利用することは可能です。 puts Greeting.new(‘esehara’, ‘Hello, #{name}’).say #output: Hello, esehara puts Greeting.new(‘esehara’, ‘こんにちは, #{name}’).say…(Continue Reading)

Rubymineで、cmd + / を押してのコメントアウト時、先頭にスペースを入れたい

投稿者: Anonymous 他のエディタでは当たり前のことなのですが、、 puts “Hello World!” という行でcmd + / を押すと、 #puts “Hello World!” となり、#の後に半角スペースが入りません。 細かいことですがコーディング規約に反するので、このようにスペースを入れるようにしたいのです。 # puts “Hello World!” 方法をご教授頂けると幸いです。よろしくお願い致します。 解決 That’s a known problem (https://youtrack.jetbrains.com/issue/RUBY-25454) and it should be fine starting from 2019.3.2 Preview (2019.3.2 RC is available at https://confluence.jetbrains.com/display/RUBYDEV/Early+Access+Program) Google Translate -> Japanese: それは既知の問題です https://youtrack.jetbrains.com/issue/RUBY-25454 2019.3.2 Preview (2019.3.2 RCは https://confluence.jetbrains.com/display/RUBYDEV/Early+Access+Program で利用可能です) からは問題ないはずです 回答者:…(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)

rescue に書く例外クラスの調べ方

投稿者: Anonymous MySQL にアクセスする Ruby スクリプトで Mysql2::Error::TimeoutError: Lock wait timeout exceeded; try restarting transaction: … のような例外が時々出るので mysql = ActiveRecord::Base.connection 5.times do begin mysql.execute(query) rescue Mysql2::Error::TimeoutError => e puts ‘failed. retry after 60 secs’ sleep 60 next end break end のようなリトライ処理を挟んでみたところ 例外発生箇所は mysql.execute(query) なんですが rescue Mysql2::Error::TimeoutError => e に引っかかってないようで 1 回で終了してしまいます rescue に書く捉えたい例外クラス名はどうやって調べればいいのでしょうか 解決 マニュアルに書いてなくてわからないなら、全ての例外のスーパークラスであるExceptionで捕捉して、クラス名を調べれば良いのではないでしょうか。 class…(Continue Reading)

配列を最大値の小さい順、大きい順や最小値の小さい順、大きい順に並べ変えたときの結果について

投稿者: Anonymous ary1 = [[2, 5, 9], [5, 5, 6], [2, 6, 8], [2, 5, 7]] ary2 = [[2, 9, 5], [5, 6, 5], [8, 6, 2], [7, 2, 5]] # 最大値の小さい順 p ary1.sort{|a, b| a.max <=> b.max} p ary2.sort{|a, b| a.max <=> b.max} p ” # 最大値の大きい順 p ary1.sort{|a, b| b.max <=> a.max} p…(Continue Reading)

rubyにクエリを書き、持って来た文字列が条件検索に失敗する

投稿者: Anonymous rubyの文に直書きでクエリを書き、そのdbからもってきた文字列を条件にかけて検索しようとしているのですが、持って来ている値が同じに関わらず、if文で条件がtrueになりません。 下記のようなコードなのですが、どこがおかしいのかご教授いただけないでしょうか? 条件の部分は、一番下の行の箇所となります。 $db = Mysql2::Client.new(:host => ‘localhost’, :user => ‘root’, :password => ”) usedb = $db.query(%q{use ruby_nfcpy;}) $select_column = $db.query(%q{select id, name, idm, status from users;}) $select_name = $db.query(%q{select name from users;}) $select_idm = $db.query(%q{select idm from users;}) $select_status = $db.query(%q{select status from users;}) loop do unlock_user_id = idm(nfc) p unlock_user_id $select_idm.each…(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)

Linuxでビルドしてインストールしたrubyに関するファイルをすべて削除するには

投稿者: Anonymous Linux環境でrubyをビルドして /usr/local 以下にインストールしました。 その後 rbenv でrubyをインストールしたため /usr/local/bin にあるrubyが不要になりました。 また、gemをインストールしたときに /usr/local/bin に置かれたコマンドも削除したいです。 /usr/local 以下のrubyに関するファイルをすべて削除する方法はありますか。 解決 アーカイブを展開してmakeした後のディレクトリに”.installed.list”という名前のファイルがあると思うので、探してください。その中に、インストールされたファイルのリストが記録されています。各種記録されているファイルの場所が/usr/local下であれば、.install.listに書かれたファイルを消していけば、ご希望のお掃除ができると思います。注意点としては、ディレクトリは消さずに、ファイルのみ削除してください。 gemについては、gemsディレクトリ丸ごとと、gemコマンドを消せば良いと思います。 上記作業によって消してはいけないファイルを消してしまうかも知れないので、削除行為はくれぐれもご注意を・・・(消さずに一旦 ~/tmp とかに移動させてしばらく様子見る、とかがオススメです)。 回答者: Anonymous

1からNまでの整数に対し、「約数の数がs個になる」のはいくつあるか調べるには?

投稿者: Anonymous n の約数の個数を d(n) と表すことにする。 1から10までの整数に対し、 d(n) = 1 となるのは1個、 d(n) = 2 となるのは4個、 d(n) = 3 となるのは2個、 d(n) = 4 となるのは3個ある。 一般に、 1からNまでの整数に対し、「約数の数がs個になる」のはいくつあるか調べるには どうすれば速く求まるでしょうか? とりあえずなんの工夫もしていないコードをあげておきます。 require ‘prime’ N = 10 ** 2 h = {} (1..N).each{|i| s = 1 i.prime_division.map{|j| s *= j[1] + 1} h.key?(s) ? h[s] += 1 : h[s] =…(Continue Reading)

Capybara で XPath を用いて n 番目の要素を見つけられない

投稿者: Anonymous Pagination のテストのために、最初は以下のようなコードを書いていたのですが、一つのページ内に複数のPagination を表示するページなので、一番上のブロックのみを確認することにしました。 find(“//*[@class=’pagination’]//a[text()=’2′]”).click expect(page.status_code).to eq(200) これに、以下のように *[@class=’pagination’] の末尾に [1] を追加したのですが Capybara::ElementNotFound になってしまいます。 find(“//*[@class=’pagination’][1]//a[text()=’2′]”).click expect(page.status_code).to eq(200) Test 環境ではなく Development 環境になりますが、既に Pagination の2ページ目が存在する環境で以下のようにすれば要素を取得できることが確認できました。 doc = Nokogiri::HTML(open “http://localhost:3000/”) doc.xpath(“//*[@class=’pagination’][1]//a[text()=’2′]”) Capybara が採用している XPath と Nokogiri の XPath にはなにか違いがあるのでしょうか? clickメソッドを呼び出さないなら使える expect(page).to have_xpath(“//*[@class=’pagination’][1]//a[text()=’2′]”) という風に呼び出す場合ならエラーになりませんでした。 解決 XPathを使わなくても all を使うと簡潔に書けます。 all(‘.pagination’)[1].click_link(‘2’) allは指定したクラスに合致する全ての要素を配列して返します。なので、[1]を指定すると、2番目の pagination を取得できます。 あとは、その中にある「2」のリンクをクリックすればOKです。 試してみてください。 ちなみに僕の経験上、Capybaraを使ったテストではXPathはほとんど使いません。 Capybara標準のAPIを駆使するか、テストしやすいようにview側にclassを追加することの方が多いです。 ご参考までに。 EDIT XPathでうまくいかない原因がわかりました。…(Continue Reading)

ApplicationMailerのアクションに、配列を引数に渡すとSerializationErrorになる

投稿者: Anonymous 質問させていただきます。 RubyonRailsで、サイトを作成しております。 モデルが更新された際に 複数の宛先へのメールの送信を行おうと考えています。 しかしMailerに送信したいユーザー一覧を渡すとエラーとなってしましました。 ユーザー一覧は、Applicantsという別のモデルのuser_idと 一致するユーザーを抽出しております。 何か解決策があればご教授いただければと思います。 エラーメッセージ ActiveJob::SerializationError in EventsController#update Unsupported argument type: ActiveRecord::Relation events_controller.rb def update if @event.update(event_params) applicants = @event.applicants @users = User.where(id: applicants.pluck(:user_id)) EventMailer.update_to_applicants_email(@users,@event).deliver_later else render ‘edit’ end end event_mailer.rb class EventMailer < ApplicationMailer default from: ‘[email protected]’ def update_to_applicants_email(users,event) @event = event mail to: users.pluck(:email) mail(subject: "#{@event.name}が更新されました") end…(Continue Reading)