我正在学习rails 4,我在跟随的教程中有些困惑。我正在关注Lynda Ruby on Rails 4 Essential Training。
我有一个简单的控制器,带有粗暴行为。在New操作中,我正在将实例变量作为参数(带花括号)
@subject = Subject.new({:name=>'default'})
但在创建动作中,我这样做:
Subject.new(params[:subject])
redirect_to(:action=>'index')
这个params[:subject]
和:action=>'index'
是否也应该在大括号内?
我怎么知道何时使用花括号呢?
答案 0 :(得分:2)
params[:subject]
很可能会返回一个像
{:attr1 => 'value1', :attr2 => 'value2'}
用花括号括起来会导致
{{:attr1 => 'value1', :attr2 => 'value2'}} # Not a valid Hash/Syntax
但是,render({:action => 'index'})
与没有花括号的情况相同。 Ruby非常聪明,可以确定它是Hash
而没有curlies。
将Hash作为方法的最后一个参数是常见的情况。
def my_method(arg1, arg2, options={})
..
在这种情况下,有时会优先放弃{}
,因为它可能会误认为是块
my_method 1, 2, :opt1 => 'val1'
答案 1 :(得分:1)
强大的参数
要添加到Santosh
的答案 - 在创建新的ActiveRecord对象时,你真的需要考虑strong_params
方法(如果你想保存它们):
#app/controllers/your_controller.rb
Class YourController < ApplicationController
def new
@model = Model.new
end
def create
@model = Model.new(model_params)
end
private
def model_params
params.require(:model).permit(:attributes, :for, :model)
end
end
-
选项强>
就你的redirect_to
而言,我认为Santosh很好地覆盖了基地;但是,您可能只想使用symbol
来表示加载操作:
redirect_to :index
默认情况下,Rails将使用您所在的同一个控制器,允许您指向其中的各种操作。
-
<强>更新强>
对于strong_params
,你必须记住这是做什么的。
Strong Params只是一种允许您将某些参数发送到模型的方法。这意味着如果有人试图进行大规模分配,它将不会通过未经许可的参数。
当你提到我正在调用model
两次时 - 我只是为了不同的行动而调用它。 new
操作用于创建ActiveRecord object
的新实例,create
操作用于保存该实例(您必须使用表单中的参数重新创建它)