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

3
我正在处理一个非常简单的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]”。
我现在有一个临时的修复方法,但我想知道人们通常是如何处理这种情况的。
谢谢。
2个回答

4

这只是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属性中。


好的,我其实知道这个概念,但我认为可能有更好的方法。 - Tony

3
这是一个权衡之间的选择;你可以使用稍微丑陋的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。也许我漏掉了什么... - Tony
我并不想暗示这是最佳方案。在大多数情况下,最好的选择是使用 Rail 的默认行为。我提出了一个解决方案,适用于那些(罕见的)需要良好参数的情况。在我的个人情况中,修复 CREATE 函数已经足够,但你的情况可能不同。 - kikito

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接