如何在 Ruby on Rails 应用程序中处理 RESTful URL 参数?

Posted

技术标签:

【中文标题】如何在 Ruby on Rails 应用程序中处理 RESTful URL 参数?【英文标题】:How do you handle RESTful URL parameters in a Ruby on Rails application? 【发布时间】:2010-02-20 22:32:00 【问题描述】:

我正在处理一个非常简单的 RESTful Rails 应用程序。有一个用户模型,我需要更新它。 Rails 程序员喜欢做的事情:

if @user.update_attributes(params[:user])
...

根据我对 REST 的了解,这个 URL 请求应该可以工作:

curl -d "first_name=tony&last_name=something2&v=1.0&_method=put" http://localhost:3000/users/1.xml

但是,很明显这不起作用,因为每个 URL 参数都会被解析为变量“params”而不是“params[:user]”

我现在有一个 hackish 修复,但我想知道人们通常如何处理这个问题。

谢谢

【问题讨论】:

【参考方案1】:

这只是 Rails 如何解析参数的问题。您可以使用方括号将参数嵌套在哈希中。这样的事情应该可以工作:

curl -d "user[first_name]=tony&user[last_name]=something2&v=1.0&_method=put" http://localhost:3000/users/1.xml

这应该变成

:user=>:last_name=>"something", :first_name=>"tony"

在您的 params 哈希中。这也是 Rails 表单助手构建 params 哈希的方式,它们在表单输入标签 name 属性中使用方括号。

【讨论】:

好的,我其实知道这个概念,但我认为可能有更好的方法。【参考方案2】:

这是一个权衡;你可以有稍微难看的 url,但非常简单的控制器/模型。或者你可以有漂亮的 url 但稍微丑陋的控制器/模型(用于对参数进行自定义解析)。

例如,您可以在您的用户模型上添加此方法:

class User < ActiveRecord::Base

  #class method
  def self.new_from_params(params)
    [:action, :method, :controller].each|m| params.delete(m)
    # you might need to do more stuff nere - like removing additional params, etc
    return new(params)
  end
end

现在您可以在控制器上执行此操作:

class UsersController < ApplicationController
  def create
    #handles nice and ugly urls
    if(params[:user]) @user=User.new(params[:user])
    else @user = User.new_from_params(params)
    end

    if(@user.valid?)
    ... etc
    end
  end
end

这将很好地处理您的帖子,以及来自表单的帖子。

当我需要我的客户“复制和粘贴”网址时(即他们可以通过电子邮件发送的搜索),我通常会有这种行为。

【讨论】:

这似乎不是最好的方法,因为您需要为每个 UPDATE 和 NEW 操作使用不同的函数。似乎您可以编写一个函数来提取实际上不属于模型的参数,并将其用于每个模型的 UPDATE 和 NEW 。也许我错过了什么...... 我不想暗示这是最好的方法。在大多数情况下,最好的事情是 rail 的默认行为。我为那些(罕见的)你需要好的参数的情况提出了一个解决方案。在我的特殊情况下,修复 CREATE 函数就足够了,但你的里程可能会有所不同。

以上是关于如何在 Ruby on Rails 应用程序中处理 RESTful URL 参数?的主要内容,如果未能解决你的问题,请参考以下文章

如何注销 Facebook - 在 Rails 应用程序中使用代码(Ruby on Rails Omniauth)

基于 Ruby on Rails 的网站和应用程序 [关闭]

如何在Ruby on Rails上使用SAX解析器来处理大型XML文件

Shrine Gem Ruby on Rails 无服务器图像处理程序,后台作业

如何在 ruby​​ on rails 中集成多个支付网关(多个商家)?

如何在我的 Ruby on Rails 应用程序上使用 ruby​​ 2.7