2011-06-08 15 views
26

Possible Duplicate:
Rails: confused about syntax for passing locals to partialsszyn 3, uboczny zmiennej lokalnej do częściowego

Chcę przekazać zmienną lokalną (która nie ma odpowiedniego pola w modelu) do częściowego.

# infos/index.html.erb 

<%= render :partial => 'info', :locals => {:info => first, :img_style => "original"} %> 

: img_style będzie stylem html dla obrazu.

# infos/_info.html.erb 
<% first = @infos.shift %> 
<%= image_tag(info.image.url, :class => img_style), info %> 
# and here goes code for normal iteration 
<% @infos.each do |e| %> 
# etc 

Ale to nie działa, zwraca błąd:

# GET /infos/ 
undefined local variable or method `img_style' for #<#<Class:0xc471f34>:0xc470cc4> 

To można zrobić bez zbędnych partials?

Przepraszamy za mój angielski. : P

EDIT:

Dobrze Informacje o modelu nie mają: pole img_style

# db/schema.rb 
    create_table "infos", :force => true do |t| 
    t.string "title" 
    t.text  "description" 
    t.integer "place_id" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    t.string "image_file_name" 
    t.string "image_content_type" 
    t.integer "image_file_size" 
    t.datetime "image_updated_at" 
    t.text  "short" 
    end 

EDIT2:

Nawet proste

<%= img_style %> 

don” t Prace.

Application Stack nazwiska

app/views/infos/_info.html.erb:3:in `_app_views_infos__info_html_erb___1029249744_92158380_1472718' 
app/views/infos/index.html.erb:7:in `_app_views_infos_index_html_erb__184644561_92172050_0' 
app/controllers/infos_controller.rb:8:in `index' 

Edit3:

Odwiedzin

# infos/index.html.erb 
<div > 
    <h1><%= t('info.infos') %></h1> 
    <div id="left"> 
    <% first = @infos.shift %> 
    <div> 
     <% @aimg_style = "original"%> 
     <%= render 'info', :locals => {@img_style => @aimg_style } %> 
    </div> 
    <ul> 
     <% @infos.each do |e| %> 
     <li> 
      <div> 
      <%= render :partial => 'info', :object => e %> 
      </div> 
     </li> 
     <% end %> 
    </ul> 
    <%= will_paginate @infos %> 

# infos/_info.html.erb 
<%#= link_to thumbnail(info, "listTabsImg", false, img_style), info %> 
    <%#= image_tag(info.image.url()) %> 
    <%= img_style %> 
<p> 
    <strong class="nameBox"><%= link_to info.title, info %></strong> 
    <span><%= info.short %>...</span> 
    <%= link_to "#{t('more')} »", info %> 
</p> 

WRESZCIE

ten temat nie działa:

# infos/index.html.erb 
<% first = @infos.shift %> 
<div class="boxEvent"> 
    <% @aimg_style = "original"%> 
    <%= first %> 
    <%= render 'info', :locals => {:info => first, :img_style => @aimg_style } %> 
</div> 

to działa:

# infos/index.html.erb 
    <% @infos.each do |e| %> 
    <li> 
     <div class="boxEvent"> 
     <%= render :partial => 'info', :locals => {:info => e, :img_style => "original"} %> 
     </div> 
    </li> 
    <% end %> 

Ktoś wie dlaczego?

+0

Która linia kodu jest w jakim pliku? Czy '<% = image_tag' umieszczony jest w' _info' częściowej, czy gdzieś indziej? Czy błąd powstaje, gdy częściowy jest wywoływany przez twój pierwszy przykład lub wywołujesz go z innego miejsca? Pytam, ponieważ wspomniałeś o zbytecznych cząstkach, ale nie powiedziałeś, że nazywasz cząstkę z więcej niż jednego miejsca. – Arsen7

+0

To może być nic - ponieważ twoje pytanie zawiera już prawidłowy kod - ale użycie skróconej składni spowoduje ten błąd: "wyrenderuj" info ",: locals => {...}'. Jeśli wywołujesz część jawnie, 'render: partial => 'info',: locals => {...}', to nie widzę żadnego powodu, dla którego to nie działa. Zgodnie z sugestią @ Arsen7, warto wiedzieć, w jaki sposób twoje cząstki są zagnieżdżone w twoim szablonie. – neezer

+0

@ Arsen7 Błąd jest zgłaszany, gdy i/informacje z przeglądarki. Chciałem to zrobić bez zbędnych częściowych (każdy częściowy dla każdego stylu, na przykład: _info_small.html.erb, _info_original.html.erb itd.) –

Odpowiedz

50

I rzeczywiście po prostu użyć tej składni w Rails 3:

render "a_partial", :a_local_variable => whatever, :another_variable => another 
+7

Cóż .. ta składnia również nie działa 'niezdefiniowana lokalna zmienna lub metoda 'img_style' dla # <# : 0xb474978>' –

+1

Powinno działać dobrze. Zmienna musi być dostępna z poziomu innego zakresu. – d11wtq

+0

Jeśli nadal nie działa dla Ciebie - prawdopodobnie twoje częściowe jest buforowane. Aby sprawdzić, czy dodasz jakieś śmieci (na przykład linię "lalala") na początku częściowej i sprawdź, czy tym razem wartość jest przekazywana do częściowego. – Alexander

12

To powinno działać:

<%= render :partial => "info", :locals => { :img_style => "original" } %> 

Mając to częściowy:

# infos/_info.html.erb 
<%= image_tag(info.image.url, :class => img_style), info %> 

Jednak jeśli dzwonisz częściowe źle, spróbuj tego jako częściowego:

# infos/_info.html.erb 
<%= image_tag(info.image.url(img_style)), info %> 
2

Twój kod (ten, który pokazałeś w pierwszym wierszu) powinien działać. Nie ma błędu. Sam go przetestowałem i działa to dla mnie.

zwykłe przyczyny takich błędów to:

  • błędnie nazwa zmiennej
  • nazywając częściowe też z jakiegoś innego miejsca, gdzie można nie zdać A: lokalnym.

Fakt, że model nie ma atrybutu "img_style" nie jest ważny.

Widzę, że w twoim infos/index.html.erb masz dwa miejsca, w których dzwonisz pod numer render :partial => 'info', :object => ... i nie masz tutaj: locale. Tylko numery linii nie pasują do wcześniej wyświetlanego stosu, więc trudno powiedzieć, które wywołanie powoduje problem.

Podejrzewam, że oba wywołania metody render wymagają poprawek.

W pierwszym należy określić, a następnie zadzwonić pod numer render :partial => "info" zamiast render "info". Może to być błąd w Railsach, ale z jakiegoś dziwnego powodu: miejscowi wydają się nie być w tym przypadku przenoszeni do widoku.

W drugim wywołaniu na render po prostu dodaj: locals.

1

Wierzę, że problem polega na wywołaniu połączenia . Wyszukuje obiekt info dla img_style. Nie potrzebujesz tego.

Uwielbiam używać częściowych, ale ostatnio widziałem również piękno w metodach pomocniczych, szczególnie w prostych renderingach takich jak ten.

def info_image(info, class_name="original") 
    image_tag(info.image.url, :class => class_name) 
end 

wtedy właśnie

<%= info_image(first) %> 

lub

<%= info_image(first, "anotherclass") %> 

w widoku. Znacznie czystsze.

Jeśli kiedykolwiek stanie się bardziej skomplikowany. Będziesz musiał zmienić kod tylko w jednym miejscu.

5

Spędziłem kilka godzin nad tym; w widoku, render :partial => ? , :locals => (....} wydaje się, jeśli pierwsze wezwanie:

render :partial => ? without a locals hash 

a następnie wywołać renderowanie :partial => ? z mieszkańcami hash hash miejscowi nie są przekazywane do widoku.

Jeśli pierwsze wywołanie zawiera skrót nazwy lokalnej z tymi samymi zmiennymi, które ustawiono na '' , wówczas drugie połączenie z wartościami RZECZYWNYM będzie działało.

+3

To nie jest błąd, to funkcja. :) –

+0

Wygląda na to, że mówisz, że pierwsze wywołanie "renderowania" może przerwać kolejne wywołanie "renderowania". Nigdy nie doświadczyłem tego zachowania. Czy mógłbyś rozwinąć lub wyjaśnić? Dziękuję Ci. – Nathan

+0

Jest to rzeczywiście bardzo prosta "funkcja". Jeśli masz 'partial', który prosi o' foo', to wywołanie 'render partial 'bez podania wartości dla' foo' spowoduje niezdefiniowany błąd zmiennej. Tak więc kod nie pęka w miejscu, w którym przekazujesz zmienną, ale w miejscu, w którym go nie przekazujesz *. Przy okazji, jeśli naprawdę * chcesz mieć "opcjonalny" lokalny, zabezpiecz go '' zdefiniowanym? 'W częściowym, jak poniżej:' foo czy jest zdefiniowany? foo'. –

Powiązane problemy