Edited at

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

More than 1 year has passed since last update.


2018/05/08 追記

あれこれ書いてますが問題解決したので追記。


development.rb

config.reload_classes_only_on_change = false;


これ追加したら↓が解決した。


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


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とはお戯れ程度の付き合いしかない俺にはまだ難しいようです。