Rails在控制器中使用哈希

时间:2014-07-09 05:41:13

标签: ruby-on-rails ruby ruby-on-rails-4

我正在学习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'是否也应该在大括号内?

我怎么知道何时使用花括号呢?

2 个答案:

答案 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操作用于保存该实例(您必须使用表单中的参数重新创建它)

您需要read up on strong params here