[英]Rails: how do params work in controller?
我想知道参数如何在Rails中工作。 所以我有一个问题控制器。 新的第一个动作意味着我需要为模型调用create new函数问对吗? 但是一旦进入创建阶段,我就会有些困惑。 new(params [:question])为我们带来了什么? 而且在节目中,通过params [:id]查找有什么作用? 我相信参数是由视图中存储的信息发送的吗? 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
What does the new(params[:question]) get for us?
当您按下诸如“ submit
按钮之类的命令时,将创建一个创建动作。 然后,该表格通过参数发送到您的控制器。 然后,您的控制器将创建一个新对象。 基本上,新的东西只是制造一个可以放东西的容器。 那东西就是参数。
in the show, what does finding by params[:id] do?
在节目中,您正在模型上调用.find。 模型是控制器中的大写单词。 模型与您的数据库进行交互。 当您调用find(这是一个有效的记录方法)时,模型将进入数据库并提取信息。 在这种情况下,它会提取ID与您的参数中的ID匹配的信息。 这些参数来自哪里? 在这种情况下,参数来自URL。 show动作的URL类似于exmaple.com/stuff/1
因此在此示例中,id = 1,params [:id] = 1
我认为您可能会发现有帮助的几点是:
new
, show
或您可以定义的一些自定义动作。 Question.new
的new
操作中,它将使用默认值初始化一个新的question实例。 Question.new(params[:question])
的create
动作中,它将初始化一个新的Question
实例,该实例从params
哈希中分配属性值,这些值通过“质量分配”来允许。 因此, @question
现在拥有一个Question
实例,该实例的值由用户提供,并由params
哈希值保存。 在访问诸如/questions/1
类的URL时执行的show
action中,除非您在config/routes.rb
配置中特别指定了其他属性,否则1
通常是id
。 如果您从终端或命令提示符处检查rake routes
的输出,则会看到以下行:
question GET /questions/:id(.:format) questions#show
这行的意思是,对于任何URL模式/questions/:id(.:format)
,其中:id
是资源ID,在这种情况下,问题id
具有可选的参数格式,请执行questions
控制器的show
操作。 这个id
和format
由Rails包含在params
哈希中,可以通过params[:id]
和params[:format]
。
因此, @question = Question.find(params[:id])
表示URL路径/questions/1
Question.find(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 [:question]中,您正在传递属性的哈希。 所以说真的,您正在做我上面所做的事情。 现在...在这里的东西上...我已经进行了验证,可以防止仅用名称保存东西...所以如果我尝试保存...我会得到错误的结果。
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分支的原因
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.