首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基础帮助

基础帮助
EN

Stack Overflow用户
提问于 2011-01-01 16:43:53
回答 3查看 286关注 0票数 4

我在rails中创建了一个名为product的脚手架应用程序。product_controller.rb文件包含以下内容。

代码语言:javascript
复制
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\x\ %> #所有表单元素声明<% f.submit“创建”%> <%= end %>
  2. 这里,@product在控制器文件中初始化并传递给这个new.rhtml。那么,form_for(@product)从哪里获取数据呢?
  3. 当单击submit按钮时,控件如何被转移到控制器文件中创建函数?不在控制器文件中指定操作。
  4. 在create函数中,redirect_to( @product )指定@product是从new.html文件中接收的对象的位置.

我对ROR的基本知识非常困惑。谁来帮我澄清一下。请原谅我做了这么大的一个职位。我对这段代码有很多疑问。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-01 16:58:27

哇,这可是很多问题。首先,让我推荐您拿起一份"起始Rails 3“的副本,这是Rails的一个非常棒的介绍,它将回答所有这些问题,并帮助您迅速成为一个非常可靠的rails程序员。

第二,以下是一些基本的答案:

1)你不应该浏览到products/create,你只应该浏览到products/new。无论何时浏览到URL,都会发送GET请求。“新”操作需要GET请求,但CREATE操作需要POST请求。POST请求是通过提交表单生成的。

因此,流动是这样的:

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

在编辑和更新中反映了NEW和CREATE之间的关系。要更改浏览到products/123/edit的对象,请提交一个触发更新操作的表单。

这一切都属于所谓的"RESTful“设计,它实际上是Rails工作方式的核心。您可能想了解更多关于REST的知识,这里是个很好的起点

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

products/edit加载页面时也会发生同样的情况,但区别是,如果您传递给form_for一个现有的(不是新的)对象,它将使用该对象的现有值填充表单的字段。

3)控制的传输是通过HTTP进行的,设置在HTML标记中。这是rails“魔力”的一部分,它为您处理浏览器和控制器之间的连接,因此您不必担心它。

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

我希望这会有所帮助,但请考虑阅读入门Rails书籍:它非常好,您可以在大约一周内完成它,您可以在坚实的基础上开始工作,而不是在您完全不熟悉的代码中徘徊,从而节省大量时间。

票数 7
EN

Stack Overflow用户

发布于 2011-01-01 16:54:21

  1. 数据使用HTML参数传递。
  2. form_for(@product)只是一个表单助手,它使用适当的操作生成适当的HTML。 更多信息:http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html
  3. 该操作在form_for中指定。
  4. redirect_to(@ product )将您重定向到新创建的产品。它通过使用@product中包含的id查找到的路由来实现这一点。 更多关于路由的信息可以在这里找到:http://edgeguides.rubyonrails.org/routing.html
票数 2
EN

Stack Overflow用户

发布于 2011-01-01 16:55:16

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

当您单击submit按钮时,它会转到/products/create,将生成的表单内容作为params传递给它。Rails采用params,并将值分配给一个新产品(使用所谓的大规模赋值)。

Rails在很大程度上是“约定多于配置”。它假设当您从/products/new视图中单击要创建对象的submit按钮时,它知道要创建。这都是由REST定义的,你应该读一读。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4574752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档