0

У меня есть теоретический вопрос о том, как реализовать концепцию MVC лучшим способом в Ruby (так как я больше знаком с не-MVC -thx для языков подсказок, таких как ASP, PHP).Сделайте это «MVC» в Ruby - или нет? (Car-> Parts)

В моем примере приложения вам необходимо управлять Автомобилем и его частями. После этого я бы (на мой взгляд) реализовать следующие два контроллера:
- CarsController
- PartsController

Оба имеют свои действия по умолчанию (индекс, шоу, редактирование, удаление).

В действии «указатель» PartsController отображаются все связанные детали для автомобиля.

В «индексных» действиях CarsController все детали автомобиля будут получать, а также дополнительно я бы включил содержание «индекс» действия PartsController проходящего через автомобили идентификатор к нему (или те, в сессии).

Пример компоновки (CarsController/показать/1)
- Автомобиль: Порше GT
- марка: Порше
- Модель: GT
- PS: 400
- Партии (исходя из PartsController/индекса, части автомобиля были кэшируются CarsController раньше):
---
дверного замка --- Двигатель 400

Я попытался с помощью

render "cars/index" 
render :action => "cars/index" 
render :template => "cars/index" 
render :controller => "cars", :action => "index" 

в моем шаблоне index.html.erb, но никто из них не работает (я каждый раз получаю сообщение об ошибке «шаблон не хватает»).

Поскольку у меня было много проблем с этим, я думаю, что моя концепция/реализация может быть неправильной.

Любые предложения по этому вопросу, чтобы найти лучший способ?

Благодарим за помощь!

UPDATE:

Хорошо здесь является более конкретные example.Lets говорят, пользователь переходит на локальный/автомобили/1. Вот шаблоны моих контроллеров для делать это:

приложение/просмотр/Автомобили/show.html.erb

<%= form_for(@car) do |f| %> 
    <div class="field"> 
    <%= f.label :brand %><br /> 
    <%= f.text_field :brand %> 
    </div> 
    <div class="field"> 
    <%= f.label :model %><br /> 
    <%= f.text_field :model %> 
    </div> 
    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 
<%= render "parts/index" %> 

приложение/просмотр/частей/index.html.erb

<table> 
    <% @parts.each do |part| %> 
    <tr id="part-<%= part.id %>"> 
    <td><%= part.amount %></td> 
    <td><%= part.price_total %></td> 
    </tr> 
    <% end %> 
</table> 

Части загружаются из кеша, поэтому идентификатор автомобиля не требуется для PartsController (еще нет)!

routes.rb

resources :cars do 
    resources :parts 
end 

Затем я` получить следующее сообщение об ошибке:

Missing partial parts/index with {:locale=>[:en], :formats=>[:html], :handlers=>[:erb, :builder, :coffee]}. Searched in: * "D:/Dev/Ruby/MyCRM/app/views" * "C:/Ruby193/lib/ruby/gems/1.9.1/gems/datagrid-0.5.3/app/views"

+0

Ни «ASP», ни PHP [* языки функционального программирования *] (http://en.wikipedia.org/wiki/Functional_programming). Btw: это для Rails? Еще одна структура? Если да, обновите его, чтобы отразить. –

+0

спасибо. «отражать»? – Thomas233

+0

Я не совсем уверен, что вы здесь делаете. По умолчанию действие «index» состоит в том, чтобы показать список всех вещей - например, автомобили/индекс будут показывать все автомобили. Я думаю, вы думаете о действии «шоу», которое показывает одно. то есть автомобили/1 = показать автомобиль 1. --- дается ли вам более подробная ошибка, чем «шаблон отсутствует»? можете ли вы опубликовать, на каком пути он пытается найти шаблон? – YenTheFirst

ответ

0

Это похоже на то, что вы пытаетесь сделать, называется «рендеринг частичного» в Rails.

Основная идея заключается в том, что у вас есть кусок html (в данном случае, шаблон частей для отображения списка деталей для определенного автомобиля), и эта часть входит в одну или несколько полных страниц.

render "parts/index" 

не работает, потому что он ищет частичного имени «индекс» в папке частей, а не полную страницу. По соглашению частичные элементы в Rails называются с лидирующим знаком подчеркивания.

Чтобы получить эту работу, вы должны создать частичную, то есть, приложение/просмотров/частей/_list.html.erb

Вторая часть, что парциальное нужно будет иметь доступ к списку частей. Если ваш контроллер автомобиля не создает переменную @parts, это нужно будет вывести. Как это делается на практике, это передача локальных переменных. Таким образом, вы бы переписать _list.html.erb использовать «части» вместо «@parts», то в контроллере автомобиля, вы бы сделать его так:

render "parts/list", :locals => {:parts => @car.parts} 

в индексе для деталей, если вы хотите перечислить все части, вы бы вынести частичное так:

render "list", :locals => {:parts => @parts} 

для получения дополнительной информации, а также более подробное пошаговое руководство, прочитайте: http://guides.rubyonrails.org/layouts_and_rendering.html#using-partials

+0

Thank вы очень много иены для этого подробного объяснения.Я дам ему попробовать и поставить отзыв здесь. Спасибо! – Thomas233

+0

Эй, я. Спасибо, что у меня все получилось. Кажется, это правильный путь для меня ... – Thomas233

0

Вы на самом деле есть целый ряд различных проблем, прямо сейчас. Положительным из вашего поста является то, что у вас должно быть два контроллера, как вы указали. Маршрутизация (это то, как рельсы обрабатывают веб-запросы) - очень сложная тема, когда вы новы, но чрезвычайно важны.

Я предлагаю вам начать с this document, и если у вас остались вопросы после этого, попросите еще раз.

+0

Привет, спасибо Я исправил маршруты в своем первом сообщении (моя ошибка). – Thomas233

+0

Каков полный каталог, в котором у вас это есть? 'PartsController/index.html.erb' Как вы настраиваете свои маршруты, рельсы ищут его в 'app/views/parts /' –

+0

Эй, майк, добавил абсолютные пути в моем первом сообщении (проект был создан с RubyMine, поэтому структура каталогов должна быть в порядке. – Thomas233