控制器操作new的重点是什么,并创建具有相同的新方法?

时间:2017-06-22 07:29:59

标签: ruby-on-rails ruby

我一直在研究多个rails教程,但我不明白为什么方法new和方法create都有

@example = Example.new

new方法在所有此控制器操作完成后呈现@example = Example.new时,new方法有什么意义?

4 个答案:

答案 0 :(得分:0)

@example = Example.new意思是准备表单,以便用户可以填写表单中的数据,@ example的实例将保存该值。

创建

@example = Example.new意味着创建新对象以将数据保存到数据库中,通常创建@ examle.save,这将保存从new传递的数据(通过参数)

答案 1 :(得分:0)

在Rails' REST new和create的实现方式不同。

HTTP GET to / resources / new旨在呈现一个适合创建新资源的表单,它通过调用控制器中的新操作来完成,该操作创建一个新的未保存记录并呈现表单。

对/ resources的HTTP POST获取作为新操作的一部分创建的记录,并将其传递给控制器​​中的create操作,然后控制器尝试将其保存到数据库中。

关于create的Ruby on Rails文档:

create(attributes = nil){| object | ...}

  

如果验证通过,则创建一个对象(或多个对象)并将其保存到数据库。无论对象是否已成功保存到数据库,都会返回结果对象。

关于new的Ruby on Rails文档:

new(attributes = nil){| self if block_given?| ...}

  

可以将新对象实例化为空(传递无构造参数)或使用属性预先设置但尚未保存(传递具有与关联表列名匹配的键名的哈希)。在这两种情况下,有效的属性键由关联表的列名确定 - 因此您不能拥有不属于表列的属性。

因此create实例化新对象,验证它,然后将其保存到数据库中。 new仅创建本地对象,但不会尝试验证或将其保存到数据库。

答案 2 :(得分:0)

  

当所有这些控制器操作都是为了渲染新页面时,@ method = Example.new的新方法有什么意义呢?

因为它使用@example对象的属性呈现页面。

您可能假设在新初始化的对象上,所有属性的值都为nil。情况不一定如此,因为模型中的代码(例如after_initialize回调或enum)可能会提供默认值。

在某些情况下,控制器代码本身也可能提供默认值,无论是从当前用户推断还是通过参数传入。

答案 3 :(得分:0)

您将采用Sub Worksheet_Change(ByVal Target As Range) Set MyPlage = Range("L3:L200") For Each cell In MyPlage Select Case cell.Value Case Is = "Yes" cell.Interior.ColorIndex = 10 Case Is = "No" cell.Interior.ColorIndex = 6 Case Else cell.Interior.ColorIndex = xlNone End Select Next End Sub 这样的方法:

create

请注意,当保存返回def create @example = Example.new(example_params) if @example.save redirect_to @example else render 'new' end end 时,create操作render内部将被使用,而不是redirect_to。使用false方法,以便在呈现时将render对象传递回新模板。

您需要告诉用户出现问题。为此,您需要修改app / views / examples / new.html.erb以检查错误消息:

@example

我们检查<% if @example.errors.any? %> <div id="error_explanation"> ... </div> <% end %> 是否有任何错误,在这种情况下,我们会显示@example.errors.any?所有错误的列表。

原因 @example.errors.full_messages@example = Example.new为何{1}}在我们的视图中ExamplesController@example,并且调用nil会抛出错误。