ruby on rails基础知识帮助

时间:2011-01-01 16:43:53

标签: ruby-on-rails

我在rails中创建了一个名为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

现在提供了网址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文件收到的对象的位置...

  5. 我对ROR的基础知识非常困惑。有人请帮我澄清一下。请原谅我发这么大的帖子。我对这段代码有很多疑问

3 个答案:

答案 0 :(得分:7)

哇,这是很多问题。首先,我建议你拿一份“Beginning Rails 3”,这是对Rails的精彩介绍,可以回答所有这些问题并帮助你快速成为一个非常扎实的铁轨程序员。

其次,以下是一些基本答案:

1)您不应浏览products/create,只需浏览products/new即可。每当您浏览到您正在发送GET请求的URL时。 “new”操作需要GET请求,但CREATE操作需要POST请求。 POST请求是通过提交表单生成的。

因此,流程是这样的:

新操作用于创建适合相关模型(产品)的表单。当您从products/new提交表单时,它将POST到products/create,这将触发CREATE操作中的代码。

NEW和CREATE之间的关系在EDIT和UPDATE中反映出来。即,将您浏览的对象更改为products/123/edit,然后从那里提交一个触发UPDATE操作的表单。

这一切都属于所谓的“RESTful”设计,这实际上是Rails如何工作的核心。您可能想要了解有关REST的更多信息,here's a good place to start

2)form_for从控制器获取数据 - 但在新操作的情况下,它不是获取数据,只是一个空(新)对象。 form_for是一个帮助器,它接收一个对象,并从该对象确定需要发生的一些HTML,以便生成的表单与您的控制器正确交互。

products/edit加载页面时会发生同样的情况,但区别在于如果您传递form_for现有(非新)对象,它将使用现有对象填充表单的字段来自对象的值。

3)通过HTML <form>标记中设置的HTTP请求进行控制转移。这是rails的“魔力”的一部分,它为您处理浏览器和控制器之间的联系,因此您不必担心它。

4)我通常不会使用redirect_to(@product),但我希望它能带您进入刚刚创建的产品的页面,即:products/123其中123是产品的ID

我希望这会有所帮助,但请考虑选择Beginning Rails一书:它非常好,你可以在大约一周内完成它,你可以通过开始坚实的基础而节省大量的时间而不是像这样徘徊,这对你来说完全不熟悉。

答案 1 :(得分:2)

  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。

    中包含的id查找到Product控制器的路由来完成此操作

    有关路由的更多信息,请访问:http://edgeguides.rubyonrails.org/routing.html

答案 2 :(得分:0)

作为用户,您永远不会转到/products/create路径。这是提交按钮的目的地。当您转到products/new时,new.html.erb模板中使用的变量的默认值。在这种情况下,正在创建@product

当您点击提交按钮时,它会转到/products/create,将生成的表单内容作为params传递给它。 Rails正在使用参数并将值分配给新产品(使用称为质量分配的东西)。

Rails非常“约定优于配置”。它假定当您从/products/new视图中单击提交按钮时,您正在创建一个对象,因此它知道要创建。这些都是由REST定义的,您应该阅读这些内容。

最后,redirect_to是一个超级智能函数,它知道对象是否正在传递给它,你想要转到该产品的show视图。