2010-02-20 2 views
3

아주 간단한 RESTful Rails 애플리케이션을 다루고 있습니다. 사용자 모델이 있으며이를 업데이트해야합니다. 코더가 할 좋아 난간 :Ruby on Rails 응용 프로그램에서 RESTful URL 매개 변수를 어떻게 처리합니까?

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

어떻게 Rails가 매개 변수를 구문 분석하는지에 관한 문제입니다. 대괄호를 사용하여 해시에 매개 변수를 중첩 할 수 있습니다. 이런 식으로 뭔가 작동합니다 : 이것은 당신의 params 해시

{:user=>{:last_name=>"something", :first_name=>"tony"}} 

로 설정해야

curl -d "user[first_name]=tony&user[last_name]=something2&v=1.0&_method=put" http://localhost:3000/users/1.xml 

. 이것은 Rails가 헬퍼를 구성하여 params 해시를 만드는 방법이며, 폼 입력 태그 name 속성에서 대괄호를 사용합니다.

+0

저는 실제로이 개념을 알고 있지만 더 좋은 방법이있을 것이라고 생각했습니다. – Tony

3

이것은 절충점입니다. 당신은 약간 못생긴 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 

또한이 글을 잘 귀하의 게시물을 처리 할 것 양식에서 오는.

나는 일반적으로 클라이언트가 "복사하여 붙여 넣기"할 필요가있을 때 (즉, 이메일을 통해 보낼 수있는 검색에 대해) 이러한 종류의 동작이 발생합니다.

+0

각 UPDATE 및 NEW 작업에 대해 다른 기능이 필요하기 때문에이 방법은 가장 좋은 방법이 아닙니다. 모델에 실제로 속하지 않은 매개 변수를 추출하여 모든 모델에 대해 UPDATE 및 NEW에 사용하는 한 함수를 작성할 수있는 것처럼 보입니다. 어쩌면 나는 뭔가를 놓치고있다. – Tony

+0

나는 이것이 가기에 가장 좋은 방법이라고 암시하고 싶지 않았다. 대부분의 경우 레일의 기본 동작이 가장 좋습니다. 좋은 매개 변수가 필요한 희귀 한 경우를위한 솔루션을 제안했습니다. 필자의 특별한 경우 CREATE 함수를 수정하는 것으로 충분했지만 마일리지는 다를 수 있습니다. – kikito