Рубин на рельсах основы помогают - PullRequest
4 голосов
/ 01 января 2011

я создал приложение в скаффолдах с именем product.Файл product_controller.rb содержит следующее.

class ProductsController < ApplicationController

  def new
    @product = Product.new

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

  def create
    @product = Product.new(params[:product])
    respond_to do |format|
      if @product.save
        flash[:notice] = 'Product was successfully created.'
        format.html { redirect_to(@product) }
        format.xml  { render :xml => @product, :status => :created, :location => @product }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @product.errors, :status => :unprocessable_entity }
      end
    end
  end

Теперь, когда задан URL http://localhost:3000/products/create

  1. При нажатии на ссылку нового продукта управление передается в новое определение в классе контроллера, а затемпеременная экземпляра @product создана.НО ГДЕ ЭТО ИЗМЕНЕНО?Функция в свою очередь вызывает new.rhtml, который содержит

    <% form_for(@product) do |f| %>
    #all form elements declaration
    <% f.submit "Create" %>
    <%= end %>
    
  2. Здесь @product инициализируется в файле контроллера и передается в этот new.rhtml.Так откуда же form_for (@product) получает данные?

  3. Как управление передается для создания функции в файле контроллера при нажатии кнопки отправки?Нет, где указано действие для файла контроллера.

  4. в функции create, что redirect_to (@product) указывает, где @product - это объект, полученный из файла new.html ...

Я очень запутался в основах ROR.Кто-то, пожалуйста, помогите мне уточнить это.простите за то, что я сделал такой большой пост.У меня много сомнений в этом единственном куске кода

Ответы [ 3 ]

7 голосов
/ 01 января 2011

Ух ты, вопросов много.Во-первых, позвольте мне порекомендовать вам взять копию " Beginning Rails 3 ", которая представляет собой фантастическое введение в Rails, которое ответит на все эти вопросы и поможет вам быстро стать очень надежным программистом rails.

Во-вторых, вот несколько основных ответов для вас:

1) Вы не должны переходить к products/create, вы просто переходите к products/new.Всякий раз, когда вы переходите по URL, вы отправляете запрос GET.«Новое» действие ожидает GET-запрос, но действие CREATE ожидает POST-запрос.POST-запросы генерируются путем отправки форм.

Таким образом, поток выглядит следующим образом:

Действие NEW используется для создания формы, соответствующей рассматриваемой модели (продуктам).Когда вы отправляете форму из products/new, она отправляет POST в products/create, что вызывает код в действии CREATE.

Отношения между NEW и CREATE отражаются в EDIT и UPDATE.То есть, чтобы изменить объект, который вы просматриваете на products/123/edit, и оттуда вы отправляете форму, которая запускает действие UPDATE.

Все это подпадает под то, что называется «RESTful» дизайном, который действительно является сердцемкак работает Rails.Вы можете узнать больше о REST, вот хорошее место для начала .

2) form_for получает данные от контроллера - но в случае действия NEW это нене получаю данные, просто пустой (новый) объект.form_for - это помощник, который получает объект, и из этого объекта определяет часть HTML-кода, который должен произойти, чтобы сгенерированные формы правильно взаимодействовали с вашим контроллером.

То же самое происходит, когда вызагрузить страницу на products/edit, но разница в том, что если вы передадите form_for существующий (не новый) объект, он заполнит поля формы существующими значениями объекта.

3)Передача управления происходит через HTTP-запрос, настроенный в теге HTML <form>.Это часть «магии» рельсов, она обрабатывает связи между браузером и контроллерами, поэтому вам не нужно об этом беспокоиться.

4) Я обычно не использую redirect_to(@product), но я ожидаю, что он приведет вас на страницу с продуктом, который вы только что создали, то есть: products/123, где 123 - идентификатор продукта.

Надеюсь, это поможет, но, пожалуйста, подумайте о выборевверх по книге Beginning Rails: это очень хорошо, вы можете пройти через это примерно через неделю, и вы сэкономите ТОННЫ времени, начав на прочной основе, вместо того, чтобы бродить по коду, который вам совершенно незнаком.

2 голосов
/ 01 января 2011
  1. Данные передаются с использованием параметров HTML POST.

  2. form_for (@product) - это просто помощник формы, который генерирует правильную форму HTML с соответствующейдействия.

    Дополнительная информация: http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html

  3. Действие указано в form_for.

  4. redirect_to (@product) перенаправляет вас на вновь созданный продукт.Это делается путем поиска маршрута к контроллеру продукта с использованием идентификатора, содержащегося в @ product.

    Подробнее о маршрутизации можно найти здесь: http://edgeguides.rubyonrails.org/routing.html

0 голосов
/ 01 января 2011

Как пользователь, вы никогда не пойдете по пути /products/create.Это место назначения для кнопки отправки.Когда вы переходите к products/new, значения по умолчанию для переменных используются в шаблоне new.html.erb.В этом случае создается @product.

Когда вы нажимаете кнопку отправки, она переходит к /products/create, передавая содержимое формы, которая была сгенерирована, как params.Rails принимает параметры и присваивает значения новому продукту (используя что-то, называемое Mass Assignment).

Rails - это "соглашение по конфигурации".Предполагается, что при нажатии кнопки «Отправить» в представлении /products/new создается объект, поэтому он знает, что нужно создать.Это все определяется REST, что-то, о чем вы должны прочитать.

Наконец, redirect_to - это супер-умная функция, которая знает, передается ли ей объект, вы хотите перейти к show просмотреть этот продукт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...