Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在RubyonRails应用程序中处理RESTfulURL参数?_Ruby On Rails_Rest_Restful Url - Fatal编程技术网

Ruby on rails 如何在RubyonRails应用程序中处理RESTfulURL参数?

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 -

我正在处理一个非常简单的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 -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函数就足够了,但是您的里程数可能会有所不同。