我想知道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
答案 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)
我认为您可能会发现有用的几点:
new
,show
或您可以定义的某些自定义操作。 new
时的Question.new
操作中,它会使用默认值初始化一个新的问题实例。create
时的Question.new(params[:question])
操作中,它会初始化新的Question
实例,从params
哈希中分配属性值,这些属性值允许通过“质量分配”。因此,@question
现在拥有Question
的实例,其值由用户提供并由params
哈希保存。在访问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
控制器的动作。此questions
和id
包含在Rails的format
哈希中,可通过params
和params[: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分支的原因