【Ruby on Rails】インスタンス変数がViewに渡らない

ほんとシンプルなコードではまる

posts_controller.rb
class PostsController < ApplicationController

  def index
    @posts = Post.all
  end

end
index.html.erb
<% @posts.each do |post| %>
  <%= post.title %><br>
<% end %>

index.html.erbの方で@postsがnilだと怒られる。
コントローラーからビューに変数が渡らないぞー

ちなみに環境

  • Windows 10
  • Vagrant + VirtualBox
  • CentOS 6.9
  • Ruby 2.4.0
  • Rails 5.1.3

Pumaサーバーを再起動したら治った

rails s -b 0.0.0.0

Pumaサーバー立ち上げっぱなしで作業していたんですが
そうするとインスタンス変数の変更は反映されないんですか?

まじか。。。
そんなばかな。。。

と思うわけだが
事実サーバー再起動すると変更が反映され
再起動しない限り反映されないのだ。

いろいろ試したところ、サーバー立ち上げっぱなしでも

  • viewの変更は反映される。
  • コントローラーの変更は反映されない。

という振る舞い。

サーバー立ち上げた時点でrb側はプリコンパイルされてるんかな
実行速度考えればそっちのがいいと思うけど
そういう仕様なのかな?
俺の環境がふぁびょってるのかな

うーんわからん

追記、根本的な解決方法はまだわからないけれど

Vagrantの共有フォルダにプログラム一式を置いていることが影響しているっぽい。
ちなみに共有フォルダはリアルタイムに同期されるプラグインvagrant-vbguestを導入している。

railsアプリを作るときはこんな感じでやっていた

cd /vagrant
rails new myapp
cd ~/
ln -s /vagrant/myapp myapp

railsのアプリ一式は共有フォルダに置き
homeにシンボリックリンクmyappを作っている。

試しに

cd ~
rails new hoge

としてファイルの実態もhomeに置き適当なページを作って試したところ
Pumaサーバーを再起動せずともcontrollerの変更が検知された。

共有フォルダのパーミッションかユーザー、グループあたりの問題だろうか?

viewもcontrollerもパーミッションは同じ。だのに
viewの変更は反映されて、controllerの変更は無視される
ということで

Linuxとはお戯れ程度の付き合いしかない俺にはまだ難しいようです。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.