нужен другой набор глаз на рельсах - вопрос проверки - PullRequest
1 голос
/ 27 января 2010

У меня есть простая форма, которая берет некоторые поля и добавляет их в базу данных. Под формой находится HTML-таблица, которая отображает все продукты, которые в настоящее время находятся в БД.

Контроллер: pages, действие: product

#@product is for form capture
#@prods is for displaying list of all products
def product
 @product = Product.new(params[:page])
 respond_to do |format|
  if @product.save
   @prods = Product.find(:all)
   flash[:product] = "Product #{params[:pname]} saved successfully"
  else
format.html { render :controller => "pages", :action => "product" }
format.xml  { render :xml => @product.errors, :status => :unprocessable_entity }
  end
end
 @prods = Product.find(:all)
  flash[:product] = "Currently there are #{@prods.size} products"
end

Просмотр:

    <!--show form-->
    <% form_for(@product) do |p| %>   
  <%= p.error_messages %>
  <tr><td><%=p.label 'Product*'%></td>
  <td><%=p.text_field :prod_name%></td>
  </tr>
  <tr><td><%=p.label 'Product Price*'%></td>
  <td><%=p.text_field :prod_orig_price%></td>  
  </tr>
  <tr>
  <td><%=p.label 'Product Discount'%></td>
  <td><%=p.text_field :prod_dis_per%></td>
  </tr>
  <tr>
  <td><%=p.label 'Product Promo Code'%></td>
  <td><%=p.text_field :prod_promo%></td>
  </tr>
  <tr align="center"><td colspan="4"><%= submit_tag "Add Product" %></td>
  </tr>
  </table>
<%end%>

  <!--show table-->
  <%if @prods != nil%>
 <tr>
  <th>Product Name</th>
  <th>Product Price</th>
  <th>Product Discount</th>
  <th>Product Promocode</th>
 </tr> 
 <% for p in @prods%>
 <tr>
  <td><%=p.prod_name%></td>
  <td><%=p.prod_orig_price%></td>
  <td><%=p.prod_dis_price%></td>
  <td><%=p.prod_promo%></td>
 </tr>
 <%end%>
<%end%>

Первый раз вокруг страницы загружается нормально. Я вижу форму и вижу таблицу с заполненными продуктами. Однако, когда я пытаюсь оставить все поля пустыми, чтобы увидеть, что проверка работает, я вижу сообщение uninitialized constant ProductsController я имею map.resources :products внутри моего маршрута. Моя версия рельсов 2.3.5.

Я был в этом некоторое время. Я уверен, что мне не хватает чего-то базового из-за моего недостаточного понимания рамок рельсов.

Ответы [ 2 ]

1 голос
/ 27 января 2010

Здесь много чего происходит, однако, чтобы решить вашу непосредственную проблему, вы должны сделать это:

  1. скрипт / генерация продуктов контроллера
  2. создать действие index в контроллере продуктов
  3. переместите ваш код выше в def product к вашему новому def index действию.
  4. переместить ваш взгляд с /pages/products.html.erb на /products/index.html.erb.

Я собираюсь отредактировать это, чтобы объяснить почему, но сейчас это должно помочь вам начать.

Почему!

Когда вы определяете ресурс отдыха в вашем routes.rb, например, записывая map.resources :products, rails ожидает, что вы будете писать свои контроллеры в спокойном режиме. Для вас это означает, что если вы хотите получить ресурс по продуктам, вам понадобится ProductsController со следующими действиями (вам нужно реализовать только те, которые вам нужны): index, show, new, create, edit, update, delete. Это должно объяснить, почему ваш код не работал.

Я не уверен, каково содержимое вашего routes.rb, но я предполагаю, что ваш маршрут по умолчанию все еще определен, что объясняет, почему вы можете перейти к /pages/products.

При использовании form_for(@product) рельсы будут генерировать <form action="/products" method="post">, что будет соответствовать вашему действию new.

Сказав все это, я предлагаю вам сделать следующее:

  1. Читайте о Ресурсы Rails .
  2. Сделайте так, чтобы ваше приложение было более спокойным, например, выделите страницу /new для продуктов, которая отображает форму, вы всегда можете <%= render :partial => 'form' %> в других ваших действиях поделиться функциональностью нового продукта. Это поможет с тестированием и облегчит поддержку вашего кода.
  3. Взгляните на плагин Inherited resources . Он поможет вам в правильном направлении и, надеюсь, избавит вас от написания большого количества кода.
  4. Взгляните на плагин formtastic . Это поможет вам создать семантически правильные формы, сократить код вашей плиты котла и упростить вашу жизнь.
  5. Читайте о rails partials . Это поможет вам сузить кругозор.

У Rails может быть довольно крутая кривая обучения, но есть много литературы, чтобы помочь вам. Я надеюсь, что этот ответ направит вас в правильном направлении и даст вам возможность подумать.

0 голосов
/ 27 января 2010

Если вы не включили весь соответствующий код, в вашем методе product отсутствует блок respond_to:

respond_to do |format|
  format.html { render :controller => "pages", :action => "product" } 
  format.xml  { render :xml => @product.errors, :status => :unprocessable_entity 
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...