3

非常に単純な RESTful Rails アプリケーションを扱っています。User モデルがあり、更新する必要があります。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[:user]」ではなく変数「params」に解析されるため、機能しないことは明らかです。

今のところハック的な修正がありますが、人々が通常これをどのように処理するかを知りたかったのです。

ありがとう

4

2 に答える 2

4

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属性で角括弧を使用します。

于 2010-02-20T22:53:23.927 に答える
3

It's a tradeoff; You can have slightly ugly urls, but very simple controller/models. Or you can have nice urls but slightly ugly controller/models (for making custom parsing of parameters).

For example, you could add this method on your User model:

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

Now on your controller you can do this:

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

This will handle your post nicely, and also posts coming from forms.

I usually have this kind of behaviour when I need my clients to "copy and paste" urls around (i.e. on searches that they can send via email).

于 2010-02-21T00:40:56.090 に答える