Как вы обрабатываете параметры RESTful URL в приложении Ruby on Rails? - PullRequest
3 голосов
/ 21 февраля 2010

Я имею дело с очень простым приложением RESTful 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]»

У меня есть хакерское решение, но я хотел знать, как люди обычно справляются с этим.

Спасибо

Ответы [ 2 ]

4 голосов
/ 21 февраля 2010

Вопрос только в том, как 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 формы.

3 голосов
/ 21 февраля 2010

Это компромисс; У вас могут быть немного некрасивые 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

Это будет хорошо обрабатывать ваши сообщения, а также сообщения из форм.

У меня обычно такое поведение, когда мне нужно, чтобы мои клиенты «копировали и вставляли» URL-адреса (то есть при поиске, который они могут отправить по электронной почте).

...