Rails: bingung tentang sintaks untuk meneruskan penduduk lokal ke parsial

99

Memahami "sihir" Rails yang berkaitan dengan rendering parsial (dan memasukkan penduduk lokal ke dalamnya).

Mengapa ini berhasil:

<%= render "rabbits/form" %>

Dan pekerjaan ini:

<%= render "rabbits/form", :parent => @warren, :flash => flash %>

tapi ini tidak berhasil:

<%= render "rabbits/form", :locals => { :parent => @warren, :flash => flash } %>

Tapi ini memang:

<%= render :partial =>"rabbits/form", :locals => { :parent => @warren, :flash => flash } %>

Juga, bagaimana saya bisa mencari nuansa ini sehingga saya tidak perlu mengganggu orang di SO?

Meltemi
sumber
3
Dalam komentar di bawah Anda mengatakan bahwa dokumen api rel tidak dapat dicari. Anda harus mencoba situs ini sebagai gantinya: apidock.com/rails . Ini juga memiliki ruby ​​dan rspec di sana.
ryeguy

Jawaban:

152

Jawaban singkatnya adalah metode render melihat argumen pertama yang Anda berikan. Jika Anda memasukkan hash (yang menyertakan :partial => 'foo', :locals => {blah blah blah}) maka metode ini akan meneruskan semua argumen Anda sebagai hash dan menguraikannya sesuai dengan itu.

Jika Anda memasukkan string sebagai argumen pertama Anda, argumen pertama akan diasumsikan sebagai nama parsial Anda, dan sisanya akan diteruskan sebagai penduduk lokal Anda. Namun, dalam panggilan berikutnya, itu sebenarnya menetapkan :locals => your_locals_argument, yang dalam hal ini adalah keseluruhan :locals => {locals hash}, bukan hanya {locals hash}; yaitu Anda berakhir dengan :locals => {:locals => {locals hash}}, bukan :locals => {locals hash}.

Jadi saran saya adalah untuk selalu secara eksplisit menyampaikan nilai dengan cara yang sama sepanjang waktu, dan Anda tidak akan memiliki masalah. Untuk mempelajari tentang ini, saya langsung membuka kode itu sendiri ( actionpack / lib / base.rb , render()metode di Rails 2; Rails 3 berbeda). Ini latihan yang bagus.

Selain itu, jangan khawatir tentang "mengganggu" orang di SO. Karena itulah situs ini ada. Saya bahkan belajar sesuatu dari ini.

Doug R
sumber
5

jika Anda perlu menentukan: penduduk setempat, Anda perlu menentukan: parsial atau: template

<%= render :partial => "rabbits/form", :locals => {...} %>

harus bekerja

sethvargo.dll
sumber
ini berkaitan dengan cara ruby ​​mengevaluasi hash jika Anda penasaran dengan cara itu.
sethvargo
Memang itu berhasil .. seperti yang saya sebutkan dalam pertanyaan saya ... tapi yang saya ingin tahu adalah mengapa? dan di mana ini didokumentasikan? hanya dengan melihat sumbernya? Dan, jika itu satu-satunya cara untuk menemukan dan memahami tentang segudang nuansa di Rails ini, saya bertanya-tanya bagaimana & ke mana harus mencari & menafsirkan ini dari sumbernya. Saya tidak bisa begitu saja mengklik "render" lalu menelusuri ke sumbernya (toh tidak dengan TextMate) atau bisakah saya?
Meltemi
1
ah! jadi anda sebenarnya tertarik :). Ya, satu-satunya cara untuk mengetahui hal ini adalah dengan a.) Memiliki firasat seperti yang Anda lakukan dan b.) Melihat kode sumber. Saya tidak tahu bagaimana menelusuri sumbernya ... maaf
sethvargo
ok, saya akan menggigit ... bagaimana Anda melihat barang semacam ini? apakah kamu baru saja menggali clone https://github.com/rails/rails.git? atau apakah ada cara yang lebih baik? Maaf, tapi saya relatif baru mengenal RoR dan belum menemukan cara yang baik / mudah / konsisten untuk mencari dokumentasi Rails ... seperti bahwa ADA . http://api.rubyonrails.org/tidak mudah dicari. dan sumber dari git juga tidak ... huh
Meltemi
Saya bukan ahli dengan cara apapun, tapi saya menggunakan studio Aptana. Itu dibangun di atas platform yang sama dengan gerhana (jika Anda sudah terbiasa). Ini memungkinkan Anda untuk "mengklik" dan melacak seperti yang Anda katakan. Anda juga dapat melakukan pencarian dalam kode dan itu memiliki terminal
bawaan
2

Untuk menjadi yang terhormat, saya hanya tahu tentang kasus penggunaan ini, karena saya telah mengikuti Rails selama beberapa tahun terakhir dan membaca pengumuman bahwa cara baru untuk melakukannya telah ditambahkan. Saya sendiri sering melakukan kesalahan, tapi biasanya mudah diperbaiki.

Itu salah satu bagian dari Rails API yang belum dipikirkan secara matang, jika Anda bertanya kepada saya. Itu hanya mengakumulasi lebih banyak gula sintaksis selama bertahun-tahun, tanpa mencela perilaku lama apa pun. Metode render memiliki diabetes.

Untuk membuatnya lebih buruk, render berperilaku berbeda di pengontrol dan tampilan. Saya juga melihat konten argumen pertama untuk melihat apakah itu file, template, aksi atau parsial. Jika dimulai dengan garis miring maka itu adalah file, atau semacamnya.

Saya mendukung penggunaan notasi yang lebih pendek jika memungkinkan. Karena notasi pendek mengkomunikasikan maksud dengan cukup baik. Saat membacanya, biasanya ia melakukan apa yang menurut Anda dilakukannya. Menulis parsial tidaklah mudah.

iain
sumber
1

Berikut adalah sumber metode render dari http://api.rubyonrails.org/classes/ActionView/Rendering.html#method-i-render :

def render(options = {}, locals = {}, &block)
  case options
  # Here is your last case
  when Hash
    if block_given?
      _render_partial(options.merge(:partial => options.delete(:layout)), &block)
    elsif options.key?(:partial)
      _render_partial(options)
    else
      template = _determine_template(options)
      lookup_context.freeze_formats(template.formats, true)
      _render_template(template, options[:layout], options)
    end
  when :update
    update_page(&block)
  else
    # here the first three cases
    _render_partial(:partial => options, :locals => locals)
  end
end

Semoga bantuan ini!

Andrea Salicetti
sumber
Ini membantu , terima kasih! Tapi itu tidak membantu saya membantu diri saya sendiri ... jika Anda tahu apa yang saya maksud ...
Meltemi