rails 独学して軽くにちゃんまとめつくる

インターン中大学生のブログ

ぐるぐる回って何をしたいのかが変わってく。今はマッチングサイトを作りたい、もしくは論文のキュレーションサイトかな。

初心者の時につまづきがちなフォーム入力欄のミス

f:id:mooooooooooriiiiii:20170201142302p:plain

 

こんなエラーでてないか?

SyntaxError in SessionsController#new

<%= f.email_field :email ,class: "form-control" %>
<%= f.label :password %>
<%= f.password_field, :password ,class: "form-control" %>
<%= f.submit "ログイン", login_path, class: "btn btn-primary", data:{disable_with: "送信中..."} %>

 

これは昔よくやったミスじゃ。 f.XXX のすぐ隣にはコロン( , ) はいらん。

 

ここでは f.password_field がメソッドで、それいこうは引数。だから省略せずに書いたら

<%= f.password_field (:password ,class: "form-control" ) %>

こういう意味。コロンを付けるのは文法ミス

NoMethodError in UsersController#create
undefined method `user' for

 

 

f:id:mooooooooooriiiiii:20170201131720p:plain

 

こんなエラーがでてきた。 つかってるのは @user だから user なんて使ってないから知らんわ、と思っていた。よくわからんからエラーの箇所をコメントアウトしてtrue にしたらエラーがでなかった。よってここがエラーのポイント。

 

間違った箇所は モデルのバリデーションだった。

 

 create でエラーがでたときはキチンとモデルも見直さなきゃならんことがわかった。ビューとコントローラーしか見てなくて、モデルのことなんか全然気にしてなかった。

 

 def create
    @user = User.new(user_params)
    if true  #@user.save エラーの箇所をコメントアウト
      flash[:success] = "新規登録が完了しました"
      redirect_to root_path
    else
      render :new
    end
  end

 

 

 

次に false にしてみる。

 

 

f:id:mooooooooooriiiiii:20170201132901p:plain

 

 

あ、だめじゃん。バリデーションがかかってない。空のまま送信したんだからエラーが発生しなきゃだめなのに。ということでモデルを見に行ったら、やってしまってた。

 

class User < ApplicationRecord
  before_save {self.email = email.downcase}
  validates :user,  presence: true, length: {maximum: 50}

 

user なんて属性は作成していない。 :name のつもりが :user とやっていた。バカなミスだ。

Couldn't find User with 'id'=#  というエラーがでた。

Couldn't find User with 'id'=#<ActionController::Parameters:0x007f9ad8f88b60>

 

バカみたいなミスだが、コントローラーの create アクションでは

  def create
    @user = User.find(params[:id])
end

 といった find で探すのではなく

def create
  @user = User.new(user_params)
end

 という new で新たに作りだすものだった。何もみずにやったとたんこんなミス。まだまだ理解不足。find は new と create 以外でつかうもの。

bootstrap ヘッダーで詰まったとこ

・メニューが横並びにならない
・font awesome のアイコンと文字がずれる

 

メニューが横並びにならない。

        <ul class="nav nav-pills pull-right">
              <li>
                <%= link_to  root_path, class: "nav-pills" do %>
                <i class="fa fa-home" aria-hidden="true"></i> ホーム
              </li>
              <li>
                <%= link_to new_event_info_path, class: "nav-pills" do %>
                  <i class="fa fa-plus" aria-hidden="true"></i> イベント追加

              </li>

 

こんな感じで元締めの ul のクラスに nav-pills pull-right をいれてやる。すると、右端によせられ、横並びになる。

 

 

 

文字とアイコンがずれてしまう

f:id:mooooooooooriiiiii:20170131234036p:plain

 

こんな感じで「ホーム」という文字の横に「+」を置きたいんだが、ずれてしまう。この時のコードはこれ

<li>
 <%= link_to "ホーム", root_path, class: "nav-pills" %>

 <i class="fa fa-plus" aria-hidden="true"></i>

</li>

 

あ、この <i></i> はFont Awesome というのを使ってます。無料でアイコンが使えるサービスなのでぜひ使ってみてください。

まあいいや。次に <li> の中に<a> を放りこんだらこうなってしまった。

 

f:id:mooooooooooriiiiii:20170131234918p:plain

 

Rails4でlink_toの中にFont Awesomeのアイコンを埋め込む方法 - Qiita

 

 

           

<li>             

  <a>                

     <i class="fa fa-plus" aria-hidden="true"></i>

    <%= link_to "ホーム", root_path, class: "nav-pills" %>              

   </a>            
</li>

 

こんなのないだろと思い検索をかけてみるとあった。どうやら link ~ do をすればいいらしい。パーフェクトRuby on Rails でもたしかにこの構文はでてきたが、こんな使い方をするとは驚いた。

 

 

            

<li>               
 <%= link_to  root_path, class: "nav-pills" do %>
  <i class="fa fa-home" aria-hidden="true"></i>ホーム              
  <% end %>             
</li>

 

f:id:mooooooooooriiiiii:20170201000315p:plain

 ちょっと+が近いな。</i>と「ホーム」の間にスペースを入れよう。

半角でスペースを入れたが、二個以上は認識されなかった。こういうときは全角のスペースをいれたら直る。その結果がこれ。

 

f:id:mooooooooooriiiiii:20170201000413p:plain

ホームに+はおかしいので家のマークに変えた。

rubyでランダム数字取り出すまとめ~個数選択、番号順~

 (1..100).to_a.shuffle

 こうしたら

  [43, 52, 17, 37, 32, ・・・・26, 62] 

 こんなのがでてくる。ランダムな順番で100個。しかし100は多いから制限をかけて 10個にしよう。

(1..100).to_a.shuffle[0..10]

すると

 => [83, 75, 47, 80, 67, 36, 95, 8, 53, 3, 49]

こうなる。まあ適当な数字が得られたのはいいが、番号順になおしたい。そんなときは.sort を後ろにつける。

 

 (1..100).to_a.shuffle[0..10].sort

=> [20, 24, 32, 38, 39, 62, 64, 68, 72, 79, 82]

 これで完成。

でも2ちゃんまとめをつくるとなると、しなきゃいけないことがある。それは >>1 のコメントを必ず抜き出すこと。 >>1 がいてはじめて2ちゃんねるが成り立つ。そんなこときはこうする。

 

(2..100).to_a.shuffle[0..10].push(1).sort

 => [1, 12, 14, 26, 53, 56, 57, 59, 67, 72, 75, 80]  

 (2..100)という書き方に変えたことに注意。(1..100)だと1 が重複するおそれがあるからそうさせないためにも 乱数を発生させるときは 1 を除外しなければならない。

配列に新たに要素を加えるときは push メソッドをつかう。そして番号順にならべたいから .sort メソッドの前に push をつけなければならない。もしこれを怠って最後に push をつけたら

 

 (2..100).to_a.shuffle[0..10].sort.push(1)
 => [14, 16, 24, 38, 48, 68, 72, 82, 83, 85, 93, 1]  

 

こうなるのでご注意を。

gem kaminari で undefined method `page' for

gem kaminari で undefined method `page' for

というエラーが出る。

これは Ctrl + C を押せば解決する。

will_paginate でも同様のことがあった。

理不尽だったり、正しいのにエラーがでてる場合はいったんサーバーをおとそう。

unknown attribute XXX_id と言われたのでカラムを消して、作った。

unknown attribute XXX_id

というエラーをはかれたかたは、単純にそのカラム名をつけわすれています。

unknown attribute event_id

とかかれた方は以下のコマンドでカラム名の一覧をたしかめてみてください。

たとえば User  Ticketモデルの中のカラム名をさがしたいときは

rails c

Ticket.new

と入力すると

 => #<Ticket id: nil, user_id: nil, event_info_id: nil  comment: nil, created_at: nil, updated_at: nil>

こういうのがでてきます。ぼくがほしいのは event_id なのですが、間違えてevent_info_id を作ってしまったようです。ですので、この邪魔な event_info_id を消し、event_id を作ってみましょう。わざわざモデルを作り直す必要はありません。

 

rails generate migration Removeカラム名Fromテーブル名 カラム名:型名

と入力すればいいから、

rails generate migration RemoveEventInfoFromTickets event_info:references

rails db:migrate

でオーケーです。ぼくは event_info_id を references で指定して作成したので型名はreferences としました。(作成するときにevent : references とすると、作成されるカラム名は、 event_id になります。)

 

つぎに event_id を作成しましょう。

rails generate migration Addカラム名Toテーブル名 カラム名:型名

と入力すればいいから

rails generate migration AddEventToTickets event:references

rails db:migrate

そのサーバーを再起動させるのをわすれないように。

Ctrl + C をおし、 rails s を入力する。

 

 

ーーーーーーーーーー参考したサイト

ruby on railsのデータベースのテーブルにカラムを追加、削除する | joppot

rails generate migrationコマンドまとめ - Qiita