Raylar: yerelleri bölümlere geçirmek için sözdizimi konusunda kafa karışıklığı


99

Rails "sihrini" anlamak, parçaların işlenmesi (ve yerlileri bunlara geçirmek) ile ilgili.

Bu neden işe yarıyor:

<%= render "rabbits/form" %>

Ve bu iş:

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

ama bu yok değil çalışır:

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

Ancak bu:

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

Ayrıca, SO'da insanları rahatsız etmeme gerek kalmaması için bu nüanslara nasıl bakabilirim?


3
Aşağıdaki bir yorumda, raylar api belgelerinin o kadar aranabilir olmadığını söylüyordunuz. Bunun yerine bu siteyi denemelisiniz: apidock.com/rails . Ayrıca üzerinde yakut ve rspec var.
ryeguy

Yanıtlar:


152

Kısa cevap, render yönteminin ilettiğiniz ilk argümana bakmasıdır. Bir hash (dahil :partial => 'foo', :locals => {blah blah blah}) geçirirseniz, tüm argümanlarınızı bir hash olarak geçirecek ve buna göre ayrıştıracaktır.

İlk argümanınız olarak bir dizge iletirseniz, ilk argümanın sizin kısmi adınız olduğunu varsayar ve kalanı yerel olarak iletir. Ancak, bu sonraki çağrıda, aslında atar :locals => your_locals_argument, bu durumda :locals => {locals hash}sadece {locals hash}; yani :locals => {:locals => {locals hash}}, bunun yerine ile sonuçlanırsınız :locals => {locals hash}.

Bu yüzden benim tavsiyem, değerleri her zaman açık bir şekilde her zaman aynı şekilde aktarmanızdır ve sorun yaşamazsınız. Bunu öğrenmek için doğrudan kodun kendisine gittim ( actionpack / lib / base.rb , render()Rails 2'de yöntem; Rails 3 farklı). Bu iyi bir egzersiz.

Ayrıca, SO'da insanları "rahatsız etme" konusunda endişelenmeyin. Bu site bu yüzden var. Hatta bundan bir şey öğrendim.


5

yereller belirtmeniz gerekiyorsa, şunu belirtmeniz gerekir: kısmi veya: şablon

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

çalışmalı


Eğer bu şekilde merak ediyorsanız, Ruby'nin hash'ı değerlendirme şekliyle ilgilidir.
sethvargo

Gerçekten işe yarıyor .. sorumda belirttiğim gibi ... ama merak ettiğim şey neden? ve bu nerede belgeleniyor? sadece kaynağa bakarak mı? Ve, Rails'teki bu sayısız nüansı bulmanın ve anlamanın tek yolu buysa, o zaman bunu kaynaktan bulmak ve yorumlamak için nasıl ve nereye gideceğimi merak ediyorum . "Oluştur" u tıklayıp sonra kaynağa gidemem (zaten TextMate ile değil) yoksa yapabilir miyim?
Meltemi

1
Ah! yani gerçekten ilgileniyorsunuz :). Evet, bunları anlamanın tek yolu a.) Yaptığınız gibi bir önseziye sahip olmak ve b.) Kaynak kodunu görüntülemek. Kaynağın nasıl detaylandırılacağına dair hiçbir fikrim yok ... pardon
sethvargo

Tamam, ben nasıl yok ... ısırmak edeceğiz Eğer bu tarz şeyleri aramak? sadece kazıyor clone https://github.com/rails/rails.gitmusun? yoksa daha iyi bir yol var mı? Ama üzgünüm RoR nispeten yeni ve henüz Raylar belgeleri aramak için ... Orada öyle ki iyi / kolay / tutarlı bir yol bulamadı IS herhangi. http://api.rubyonrails.org/değil kolayca aranabilir. ve git'in kaynağı da değil ... ah
Meltemi

Ben hiçbir şekilde uzman değilim ama Aptana stüdyosunu kullanıyorum. Eclipse ile aynı platform üzerine inşa edilmiştir (eğer aşina iseniz). Söylediğiniz gibi "tıklamanıza" ve izlemenize izin verir. Ayrıca kod içi arama da yapabilirsiniz ve yerleşik terminal vb.
Bulunur

2

Dürüst olmak gerekirse, sadece bu kullanım durumlarını biliyorum, çünkü son birkaç yıldır Rails'e ayak uyduruyorum ve bunu yapmanın yeni bir yolunun eklendiğine dair duyuruları okudum. Sık sık kendimde hata yaparım, ancak genellikle kolayca düzeltilir.

Bana sorarsanız, Rails API'sinin tam olarak düşünülmemiş parçalarından biridir. Yıllar içinde, eski davranışların hiçbirini küçümsemeden, giderek daha fazla sözdizimsel şeker biriktirdi. Render yönteminde diyabet var.

Daha da kötüleştirmek için render, controller ve view içinde farklı davranır. Ayrıca bir dosya mı, şablon mu, eylem mi yoksa kısmi mi olduğunu görmek için ilk argümanın içeriğine bakıyorum. Eğik çizgiyle başlıyorsa, bir dosya veya bunun gibi bir şeydir.

Mümkün olduğunda daha kısa gösterimi kullanmaktan yanayım. Çünkü kısa gösterimler amacı oldukça iyi iletiyor. Okurken, genellikle düşündüğünüz şeyi yapar. Kısmi yazmak basit değildir.


1

İşte gelen işlemek yöntemin kaynağıdır 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

Umarım bu yardımcı olur!


Bu yardımcı olur , teşekkürler! Ama kendime yardım etmeme yardımcı olmuyor ... eğer ne demek istediğimi biliyorsan ...
Meltemi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.