2009-12-02 8 views
6

Oto rozmowa w pliku application.html.erb:Problem renderowania częściowe w układzie aplikacji (Rails)

<%= render :partial => 'tasks/_new' %> 

Oto częściowy są renderowane (_new.html.erb):

<% form_for @task do |f| -%> 
    <%= f.text_field :body %> 
    <%= submit_tag "Submit" %> 
<% end -%> 

Oto sposób w ' kontroler zadań:

def new 
    @task = Task.new 

    respond_to do |format| 
    format.html # new.html.erb 
    format.xml { render :xml => @task } 
    end 
end 

Oto komunikat o błędzie, który otrzymuję:

Missing template tasks/__new.erb in view path app/views 

A ona mówi, że jest błąd w tej linii:

<%= link_to "tasks", tasks_path %> <%= render :partial => 'tasks/_new' %> 

Plik jest w odpowiednim katalogu. Dziwne jest to, że w nazwie pliku jest extra _ w błędzie. Kiedy daję i zmienić nazwę częściowym __new.erb, tu jest błąd pojawia się:

Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id 

A ona mówi, że błąd jest w tym wierszu:

<% form_for @task do |f| -%> 

ja również próbował bez _ w kod, jak sugerował Petros, ale zwraca ten sam błąd co powyżej, Called id for nil….

Co się dzieje?

Odpowiedz

9

Nie potrzebujesz _ w kodzie. Powinno być:

<%= render :partial => 'tasks/new' %> 

Pierwszy błąd polega na tym, że nie trzeba wstawiać _ wewnątrz: parametru częściowego. Rails się tym zajmuje. Właśnie dlatego otrzymujesz podwójne __, ponieważ Rails je przygotuje.

Drugi błąd to twój prawdziwy problem. Błąd sugeruje, że @task jest zerowy. Jest to prawdą, ponieważ częściowe tylko wie, co wie widok kontenera, a twój widok w tym konkretnym momencie nie wywołał akcji od właściwego kontrolera. Ponieważ Ty (Baby Diego) już się dowiedziałeś i wskazałeś w jednym z twoich komentarzy poniżej, musisz utworzyć instancję Zadania w swoim częściowym. Nie wiem, czy istnieje bardziej eleganckie rozwiązanie, ale może ktoś może zaproponować coś lepszego w przyszłości.

Dzięki MattMcKnight za poinformowanie nas, że sama część wie tylko, co wie widok kontenera.

+0

Przepraszam, powinienem był podać. Próbowałem też tego. Zwrócił błąd "named id for zero". Naprawię OP. –

+0

Czy możesz spróbować <% = renderuj: częściowe => "zadania/nowe", locals => {: task => @task}%> ... Być może będziesz musiał zmienić @task na zadanie w swoim kodzie częściowym lub dodać na szczyt częściowego wykonania <% @task = zadanie, jeśli @task == zero%> – Petros

+0

Próbowałem wykonać tę pracę, ale nie mogłem. Pomogłeś mi zrozumieć, że problem polegał na tym, że "przypadek" @task nie dotarł do układu aplikacji, ponieważ jest związany z kontrolerem zadań, więc spróbowałem "<% form_for Task.new do | f | -%>" i zadziałało. Ale to trochę przypomina hak. Czy to właściwe podejście? –

4

Petros poprawnie zidentyfikował pierwsze wydanie - nie potrzebujesz podkreślenia w wywołaniu częściowym. Druga rzecz, o której warto wiedzieć, to fakt, że nie nazywają metody kontrolera, tylko odwołują się do widoku. Tak więc musisz ustawić obiekt @task w każdej akcji, która używa tego częściowego, lub po prostu wywołać Task.new w częściowym. Kiedy mam częściowy układ w podobnych sytuacjach, zwykle ładuję go JavaScriptem, aby móc wywołać akcję.

+0

Wołam to z układu aplikacji, akcja wykorzystująca częściowe byłoby czymś w kontrolerach aplikacji, prawda? Poza tym, ja przy użyciu "<% form_for Task.new do | f | -%>" zamiast nie jest hack? –

+0

Dzięki MattMcKnight za poinformowanie nas, że część tylko wie, co wie widok kontenera. Poprawiłem moją odpowiedź, aby była dokładniejsza. – Petros

+0

Nie jest hackem do wywoływania metody klasy na modelu. Wywołanie <% tasks = Task.find (: all,: conditions => "complete = false")%> w częściowym byłoby zbliżone do hackowania. Myślę, że kluczową koncepcją, której niektórzy ludzie nie rozumieją w Railsach, jest to, że wywoływana jest tylko jedna akcja (inaczej metoda kontrolera). – MattMcKnight

1

Jeśli cząstkowe musi wiedzieć o zmiennej w pliku powołanie erb, można przekazać go tak:

<%= render partial: "tasks/new", locals: { task: @task } %> 

aw pliku app/views/tasks/_new.html.erb, odnoszą się do zmiennych takich jak to:

<% form_for task do |f| %> 
    <%= f.text_field :body %> 
    <%= submit_tag "Submit" %> 
<% end %> 

Oznacza to, że bez @. (Kod a: b jest po prostu bardziej wygodna forma :a => b.)

Zastanawiam się jednak, dlaczego chcesz użyć partials w pliku application.html.erb? Zakładam, że masz na myśli wygenerowany przez Ruby plik app/views/layouts/application.html.erb, który ma być używany jako plik układu zawierający elementy wspólne dla wszystkich stron aplikacji, a nie dla logiki biznesowej. Być może plik, który musisz wywołać z części, to app/views/tasks/index.html.erb?

Powiązane problemy