Rails:params如何在控制器中工作?

时间:2014-02-04 22:46:58

标签: ruby-on-rails

我想知道params如何在rails中工作。所以我有一个问题控制器。第一个动作new表示我调用模型问题的创建新函数吧? 但是一旦我们进入创作,我有点困惑。新的(params [:问题])为我们带来了什么?而且在节目中,params [:id]的发现是什么?我相信params是由视图发送的,信息存储在里面吗?         def new         @question = Question.new     端

def create
    @question = Question.new(params[:question])
    if @question.save
        redirect_to @question
    else
        render 'new'
    end
end

def show
    @question = Question.find(params[:id])
end

3 个答案:

答案 0 :(得分:2)

What does the new(params[:question]) get for us?

当您按下submit按钮之类的内容时,会触发创建操作。然后该表格通过参数发送到您的控制器。然后你的控制器会创建一个新对象。基本上新的只是制作一个容器,你可以放东西。那些东西就是参数。

in the show, what does finding by params[:id] do?

在节目中你正在模特身上调用.find。模型是控制器中的大写单词。模型与您的数据库交互。当您调用find(这是一种活动记录方法)时,模型会进入您的数据库并提取信息。在这种情况下,它会提取id与你的参数中的id匹配的信息。参数从哪里来?在这种情况下,params来自URL。 show动作的URL看起来像这个exmaple.com/stuff/1所以在这个例子中id = 1和params [:id] = 1

答案 1 :(得分:2)

我认为您可能会发现有用的几点:

  1. 控制器中定义的操作顺序并不重要。因此,第一个操作可以是任何内容,可以是newshow或您可以定义的某些自定义操作。
  2. 在执行new时的Question.new操作中,它会使用默认值初始化一个新的问题实例。
  3. 在执行create时的Question.new(params[:question])操作中,它会初始化新的Question实例,从params哈希中分配属性值,这些属性值允许通过“质量分配”。因此,@question现在拥有Question的实例,其值由用户提供并由params哈希保存。
  4. 在访问show等网址时执行的/questions/1操作中,1通常为id,除非您在网站中明确指定了其他属性config/routes.rb配置。如果从终端或命令提示符检查rake routes的输出,您将看到以下行:

    question GET    /questions/:id(.:format)          questions#show
    

    此行的含义是,对于任何网址格式/questions/:id(.:format),其中:id是资源ID,在这种情况下,问题id具有可选参数格式,请执行{{1} } show控制器的动作。此questionsid包含在Rails的format哈希中,可通过paramsparams[:id]访问。

    因此,params[:format]对于网址@question = Question.find(params[:id])而言意味着Question.find(1)

答案 2 :(得分:1)

我发现想到这个的最好方法就是找到好的旧命令行。

irb(main):001:0> Thing.new
=> #<Thing id: nil, name: nil, description: nil, url: nil, image: nil, created_at: nil, updated_at: nil>

现在..当你将一个属性的参数传递给Thing.new时会发生什么?

irb(main):002:0> Thing.new(:name => 'Foo')
=> #<Thing id: nil, name: "Foo", description: nil, url: nil, image: nil, created_at: nil, updated_at: nil>

那么什么是params?好吧,在params [:question]中你传递了一个属性哈希。所以,真的,你正在做我刚刚做的事情。现在......在这里......我有一些验证可以阻止Thing用一个名字来保存...所以如果我试图保存......我会变错。

irb(main):004:0> thing = Thing.new(:name => 'Foo')
=> #<Thing id: nil, name: "Foo", description: nil, url: nil, image: nil, created_at: nil, updated_at: nil>
irb(main):005:0> thing.save
   (0.2ms)  BEGIN
   (0.2ms)  ROLLBACK
=> false

这就是if @ question.save分支的原因