Mengapa orang menyarankan untuk tidak menggunakan variabel instan untuk tampilan di Ruby on Rails

12

Mengapa saya mendengar bahwa tidak baik untuk membagikan variabel instan antara pengontrol dan tampilan. Saya agak suka karena saya bisa melihat langsung melalui @ bahwa ada sesuatu yang berasal dari controller. Saya melihat cara yang bagus untuk menggunakan helper di controller di sini: http://www.stephencelis.com/2008/09/06/rails-controllers-views-and-variables.html . Tapi saya menggunakan cancan untuk porsi itu.

Amala
sumber

Jawaban:

11

Idenya ditempatkan dalam praktik terbaik rel: Ganti variabel instan dengan variabel lokal

Pada dasarnya jika Anda tidak menggunakan banyak parsial atau memiliki tampilan tunggal polos untuk setiap metode pengontrol hanya menggunakan variabel instan dalam tampilan tidak akan benar-benar menyebabkan masalah.

Namun demikian, jika Anda menggunakan banyak parsial dan karenanya memiliki banyak variabel instance yang dideklarasikan di controller Anda ..., mungkin akan lebih membingungkan jika Anda menggunakan alternatif untuk melewatkan controller (instance) -bervariabel ke parsial secara eksplisit. Dengan begitu - saat bekerja di parsial LIHAT - Anda memiliki satu referensi eksplisit ke variabel / objek yang ingin Anda kerjakan yang tidak dibagi dengan parsial 'semua' yang termasuk dalam pembuatan halaman.

Bagaimanapun, Anda dapat menangani ini seperti yang Anda suka menanganinya, tidak ada yang akan memberitahu Anda untuk melakukannya sebaliknya. Pandangan pribadi saya, bagaimanapun, adalah bahwa saya menyukai gagasan memiliki referensi secara eksplisit di bagian / pandangan saya yang tidak dapat dikacaukan dengan variabel lain.

Ingo
sumber
5

Anda bisa mendapatkan analogi dari globalvariabel atau variabel yang dilewatkan oleh referensi, dan menganggap parsial sebagai fungsi. Jadi menggunakan variabel instance cukup banyak seperti variabel yang dikirimkan berfungsi sebagai referensi dengan semua itu pro dan kontra:

# controller 
def index
  @var = 1
end

#view index.html.erb 
<%= @var %><br/>
<%= render 'foo' %><br/>
<%= @var %>

#partial _foo.html.erb
<%= @var = 2 %>

hasilnya akan

1
2
2

Anda mungkin menginginkan perilaku seperti itu, tetapi dalam kebanyakan kasus Anda tidak membutuhkannya. Dan lebih mudah untuk memperkenalkan bug dengan cara ini dan lebih sulit untuk melacaknya. Itu sebabnya ini direkomendasikan, karena memisahkan lingkup variabel yang digunakan dalam tampilan dan parsial:

#view index.html.erb 
<%= @var %><br/>
<%= render 'foo', var: @var %><br/>
<%= @var %>

#partial _foo.html.erb
<%= var = 2 %>

hasil:

1
2
1
Grzegorz
sumber
2
Ini adalah poin yang bagus, saya tidak berpikir tentang mutabilitas variabel. Saya memiliki asumsi controller "menyajikan" variabel ke tampilan tetapi variabel instan pasti dapat memperkenalkan bug jika mereka dimodifikasi.
Amala