代码之家  ›  专栏  ›  技术社区  ›  Tony

如何在rubyonrails应用程序中处理restfulurl参数?

  •  3
  • Tony  · 技术社区  · 16 年前

    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 回复  |  直到 16 年前
        1
  •  4
  •   chrisdinn    16 年前

    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
  •  3
  •   kikito    16 年前

    这是一种权衡;你可以有稍微丑陋的网址,但非常简单的控制器/模型。或者你可以有很好的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
    

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

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