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]”

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

谢谢

4

2 回答 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哈希中。name这也是 Rails 表单助手构建 params 哈希的方式,它们在表单输入标签属性中使用方括号。

于 2010-02-20T22:53:23.927 回答
3

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

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

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

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

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

于 2010-02-21T00:40:56.090 回答