我一直试图弄清楚params方法是如何工作的,而且我对这个过程有点困惑。
例如,如果用户点击索引页面中的某个博客文章,我猜想link_to方法调用Post控制器和show动作及其块@post = Post.find(params[:id])
,然后转到数据库找到帖子,视图显示它。
所以我的遗漏链接似乎是post id传递给params方法的时候?
答案 0 :(得分:2)
因为其他人已经解释过params
,我只是直接回答你的问题:
何时将post id传递给params方法
我认为最好用一个例子来解释;见下文:
说你点击了一个链接:
/posts/1/?param1=somevalue1¶m2=somevalue2
Rails服务器收到客户想要查看此GET /posts/1/?param1=somevalue1¶m2=somevalue2
地址的请求。
要确定Rails服务器将如何响应,服务器将首先转到routes.rb
并找到将处理此请求的匹配控制器操作:
# let's say your routes.rb contain this line
# resources :posts
# resources :posts above actually contains MANY routes. One of them is below
# For sake of example, I commented above code, and I only want you to focus on this route:
get '/posts/:id', to: 'posts#show'
从上面注意到有:id
,Rails会自动将params[:id]
设置为此:id
的值。这是params[:id]
来自您的问题的答案。
不一定是:id
;你可以随意命名。您甚至可以拥有多个这样的URL参数(仅作为示例):
get /users/:user_id/posts/:id
会自动分别设置params[:user_id]
和params[:id]
上的值。
除了:id
之类的URL参数之外,Rails还会自动从路由中向params[:controller]
和params[:action]
注入值。从上面的示例get '/posts/:id', to: 'posts#show'
开始,这会将params[:controller]
设置为'posts'
,将params[:action]
设置为'show'
。
params
值也来自其他来源,例如Mayur所描述的“查询字符串”,也来自请求的body
,就像提交表单时一样(表单值在请求的body
部分内设置),就像你有JSON请求一样,为方便起见,所有这些请求都由Rails自动解析,所以你只需访问params
即可获得你需要的价值。
答案 1 :(得分:1)
params方法如何工作?
当用户请求页面时,params来自用户的浏览器。对于最常见的 HTTP GET 请求,params在URL中进行编码。例如,如果用户的浏览器请求
http://www.example.com/?post=1&comment=demo
然后params[:post]
将是" 1"而params[:comment]
将是"演示"。
在HTTP / HTML中,params实际上只是一系列键值对,其中键和值是字符串,但Ruby on Rails有一个特殊的语法,使params成为具有哈希或数组或字符串的哈希值内部。
可能看起来像这样:
{"post"=>"1", "comment"=>"demo"}
关于params的Rails指南链接:guides
答案 2 :(得分:0)
Params是带有Indifferent访问权限的红宝石哈希,意思是
hsh = {"a" => 1, "b" => 2}
将此hsh视为来自浏览器的POST请求返回的params,它是一个键值对,键为字符串。因为它是一个参数,所以值可以作为
访问 hsh["a"]
=> 1
hsh [:a]
=> 1
params是在接口加载的客户端上形成的,考虑一个具有提交按钮的表单。当您按提交时,填写表单或任何隐藏文本框的数据将形成一个哈希并传递给请求。这在服务器端收到时将被称为params或request params。
对于获取请求:通过网址发送的数据将在后端读取为params。
GET: http://www.abx.com?user=admin
params on backend: {"user" => "admin"}
This will be displayed in rails server logs
对于Put请求:在身体上发送的数据将被称为params。
PUT: http://www.abx.com
data: {"user" => "admin"} Client side
params on backend: {"user" => "admin"}
This will be displayed in rails server logs