【问题标题】:Rails params explained?Rails 参数解释?
【发布时间】:2011-07-30 21:13:22
【问题描述】:

谁能解释 Rails 控制器中的params:它们来自哪里,它们引用了什么?

  def create
    @vote = Vote.new(params[:vote])
    item = params[:vote][:item_id]
    uid = params[:vote][:user_id]
    @extant = Vote.find(:last, :conditions => ["item_id = ? AND user_id = ?", item, uid])
    last_vote_time = @extant.created_at unless @extant.blank?
    curr_time = Time.now
  end

我希望能够逐行阅读此代码并了解发生了什么。

【问题讨论】:

  • 您在服务器端 Web 开发方面的背景是什么?您已经知道哪些技术?
  • 我已经使用 HTML 和 CSS 多年了。学习了使用 PHP、JS 和 Java 的课程。虽然很少使用带有 php 的 MVC。我真的学会了使用 Java 编程。而且我彻底了解数据库理论。

标签: ruby-on-rails ruby


【解决方案1】:

当用户请求页面时,参数来自用户的浏览器。对于最常见的 HTTP GET 请求,参数编码在 url 中。例如,如果用户的浏览器请求

http://www.example.com/?foo=1&boo=octopus

那么params[:foo] 将是“1”,params[:boo] 将是“章鱼”。

在 HTTP/HTML 中,参数实际上只是一系列键值对,其中键和值都是字符串,但是 Ruby on Rails 有一种特殊的语法可以使参数成为内部带有散列的散列。例如,如果用户的浏览器请求

http://www.example.com/?vote[item_id]=1&vote[user_id]=2

那么params[:vote] 将是一个哈希,params[:vote][:item_id] 将是“1”,params[:vote][:user_id] 将是“2”。

Ruby on Rails 参数相当于$_REQUEST array in PHP

【讨论】:

  • 等价于$_REQUEST,只是$_REQUEST包括get、post和cookie数据,而params只get和post数据。
  • @renocor POST 数据也包含在 Rails params 哈希中。 Cookie 数据包含在 session 哈希中。
  • 这个答案省略了另一个参数来源:URL。有关更多信息,请参阅 hammar 的答案。
  • toasterlovin,听起来您没有阅读我回答的第二句话或看第一个示例。
  • @AnkitDhingra...我认为它始终是字符串,因为 HTTP 参数实际上只是键/值对,Rails(很可能是 Rack gem)根据键值将其解析为哈希和数组,但是我还没有看到任何告诉 Rails 值是数字的东西。
【解决方案2】:

正如其他人所指出的,params 值可以来自 GET 请求的查询字符串,也可以来自 POST 请求的表单数据,但它们还可以来自第三个地方:URL 的路径。

您可能知道,Rails 使用称为路由的东西将请求定向到相应的控制器操作。这些路由可能包含从 URL 中提取并放入params 的段。例如,如果您有这样的路线:

match 'products/:id', ...

然后,对像 http://example.com/products/42 这样的 URL 的请求会将 params[:id] 设置为 42

【讨论】:

  • 如何获得第二个参数?比如/squad/id/member/id/stuff
【解决方案3】:

Params 包含以下三组参数:

  1. 用户提供的参数
    • GET (http://domain.com/url?param1=value1&param2=value2 将设置 params[:param1] 和 params[:param2])
    • POST (例如JSON,XML会自动解析并存储在params中)
    • 注意:默认情况下,Rails 复制用户提供的参数并将它们存储在 params[:user] 中,如果在 UsersController 中,可以通过 wrap_parameters 设置进行更改
  2. 路由参数
    • match '/user/:id' 在 routes.rb 中会设置 params[:id]
  3. 默认参数
    • params[:controller]params[:action] 始终可用并包含当前控制器和操作

【讨论】:

  • 您能否在User supplied parameters 下再扩展一下您的笔记?例如,UsersController 中的 params 哈希示例会很有帮助。您的示例听起来像哈希看起来像:{first_name: "mike", user: {first_name: "mike"} ...} 这是正确的吗?
  • 我在 rails4 中没有看到。例如,{"_method"=>"put", "authenticity_token"=>"gubHya6uQrQLjPRXhOC0RUuCRdn7NFr6CeKrbRfBSHI=", "ripe"=>"true", "action"=>"update", "controller"=>"apples", "id"=>"4"}。如果我错了,请原谅我,我是一名铁路初学者。根据您的说明,我应该看到:{"_method"=>"put", "authenticity_token"=>"gubHya6uQrQLjPRXhOC0RUuCRdn7NFr6CeKrbRfBSHI=", "ripe"=>"true", "apple" => {"ripe"=>"true"}, "action"=>"update", "controller"=>"apples", "id"=>"4"} 我不知道这是否与 rails4 中的 strong parameters 有关。
  • 我在 Rails 4 中看到了重复的参数,但仅在 json POST 请求(使用 Angularjs)下,而不是在 Rails 自己的 HTML 帖子下。此链接解释了原因:stackoverflow.com/questions/10774972/…
【解决方案4】:

基本上,参数是用户指定的 Rails 应用程序数据。

当您发布表单时,通常使用 POST 请求而不是 GET 请求。当您浏览网站时,如果有帮助,您可以将正常的 rails 请求视为 GET 请求。

当您提交表单时,控件将返回给应用程序。您如何获得提交给表单的值? params 是怎么回事。

关于您的代码。 @vote = Vote.new params[:vote] 使用 params[:vote] 的数据为数据库创建新的投票。鉴于您提交的表单用户被命名为 name :vote,它的所有数据都在哈希的这个 :vote 字段中。

接下来的两行用于获取用户已提交到表单的项目和 uid。

@extant = Vote.find(:last, :conditions => ["item_id = ? AND user_id = ?", item, uid])

从数据库中找到最新的或最后插入的投票,条件为 item_id = item 和 user_id = uid。

下一行取上次投票时间和当前时间。

【讨论】:

    【解决方案5】:

    在 Rails 方面,params 是一个返回 ActionController::Parameters 对象的方法。 见https://stackoverflow.com/a/44070358/5462485

    【讨论】:

    • +1 用于澄清 params 是一种方法。 Ruby 可能难以区分变量和方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多