Ruby on rails 如何在RubyonRails应用程序中处理RESTfulURL参数?
我正在处理一个非常简单的RESTfulRails应用程序。有一个用户模型,我需要更新它。Rails程序员喜欢做:Ruby on rails 如何在RubyonRails应用程序中处理RESTfulURL参数?,ruby-on-rails,rest,restful-url,Ruby On Rails,Rest,Restful Url,我正在处理一个非常简单的RESTfulRails应用程序。有一个用户模型,我需要更新它。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 curl -
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
curl -d "user[first_name]=tony&user[last_name]=something2&v=1.0&_method=put" http://localhost:3000/users/1.xml
但是,很明显,这将不起作用,因为每个URL参数将被解析为变量“params”,而不是“params[:user]”
我现在有一个黑客补丁,但我想知道人们通常如何处理这个问题
谢谢,这只是Rails如何解析参数的问题。可以使用方括号将参数嵌套在散列中。像这样的方法应该会奏效:
curl -d "first_name=tony&last_name=something2&v=1.0&_method=put" http://localhost:3000/users/1.xml
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表单帮助程序也是这样构建参数散列的,它们使用表单输入标记name
属性中的方括号。这是一种折衷;您可以有稍微难看的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用户
现在,您可以在控制器上执行以下操作:
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
class UsersController
这将很好地处理您的帖子,以及来自表单的帖子
当我需要我的客户“复制并粘贴”URL时,我通常会有这种行为(例如,在他们可以通过电子邮件发送的搜索上)。ok,实际上我知道这个概念,但我认为可能有更好的方法。这似乎不是最好的方法,因为每次更新和新操作都需要不同的功能。似乎您可以编写一个函数来提取实际不属于模型的参数,并将其用于每个模型的更新和新建。也许我错过了什么……我不想暗示这是最好的方式。在大多数情况下,最好的事情是rail的默认行为。我正在为那些(罕见的)需要好的参数的情况提出一个解决方案。在我的特殊情况下,修复CREATE函数就足够了,但是您的里程数可能会有所不同。