【问题标题】:How do you handle RESTful URL parameters in a Ruby on Rails application?如何在 Ruby on Rails 应用程序中处理 RESTful URL 参数?
【发布时间】: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 修复,但我想知道人们通常如何处理这个问题。

谢谢

【问题讨论】:

    标签: ruby-on-rails rest restful-url


    【解决方案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 函数就足够了,但你的里程可能会有所不同。
    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    相关资源
    最近更新 更多