2011-02-18 3 views
9

레일을 처음 사용하고 있으며 필자가 수행 한 튜토리얼에서 수행 한 작업에 동의합니다. 이 문제는 잘못된 양식 제출을 처리하는 방법과 관련이 있습니다.레일에서 유효하지 않은 양식 제출을 처리하는 올바른 방법

class ThingsController < ApplicationController 


    # POST /things 
    def create 

    @thing = Thing.new(params[:thing]) 

    if @thing.save 
     flash[:notice] = 'Thing created' 
     redirect_to(@thing) 
    else 
     render :action => :new 
    end 

    end 

을 thing.save 실패 @, 사용자가 무슨 일이 있었는지의 플래시와 함께 채워져 아웃 그가 방금 입력 한 값으로, 같은 양식이 제공되는 경우 : 일을의 표준 방법은 것 같다 잘못된. 지금까지 URL이/things/new에서 things /로 바뀌 었음을 제외하면 지금까지는 좋았습니다. 대신 인덱스보기를 렌더링 할 것으로 예상됩니다.

또한 사용자가 페이지를 새로 고치면 이제 색인보기를보고 있습니다. 그가 다시 클릭하면 항상 피하려고했던 양식을 다시 제출하라는 메시지가 표시됩니다. redirect_to (new_thing_path)를 지정하면 오류 메시지와 마찬가지로 사용자의 이전 제출이 손실됩니다.

나는 물건의 생성이/물건에 게시의 결과가되어야하므로이 방법이 "정확하다"는 것을 알지만 사용자 인터페이스와 관련하여 특별히 신경 쓰지 않습니다.

"수동으로"사용자 세션에 유효하지 않은 @thing 객체를 저장할 수 있습니다. 다시 말해 new_thing_path로 리디렉션 한 후 표시되지만 해킹처럼 느껴질 수 있습니다. 그저 그렇게하는 "길의 길"이 있어야하는 것처럼 보입니다.

아이디어가 있으십니까?

+0

레일 코어에 대해 정확히 동일한 불만 사항이 있습니다. 그러나 제가 말한 것보다 더 잘 말했습니다 :) 좋은 질문입니다. – Andrew

답변

3

찾을 수 있듯이 resources :things을 지정할 때 기본적으로 새로운 것을 만들기위한 POST 경로는 /things입니다.

resources :things, :except => [ :create ] do 
    post "create" => "things#create", :as => :create, :path => 'new', :on => :collection 
end 
: 권장되지는 않지만

create_things POST /things/new(.:format)  {:action=>"create", :controller=>"things"} 
     things GET /things(.:format)   {:action=>"index", :controller=>"things"} 
    new_thing GET /things/new(.:format)  {:action=>"new", :controller=>"things"} 
    edit_thing GET /things/:id/edit(.:format) {:action=>"edit", :controller=>"things"} 
     thing GET /things/:id(.:format)  {:action=>"show", :controller=>"things"} 
       PUT /things/:id(.:format)  {:action=>"update", :controller=>"things"} 
       DELETE /things/:id(.:format)  {:action=>"destroy", :controller=>"things"} 

, 당신은 다음과 같은 경로로이 결과를 얻을 수 있습니다 : 당신이 더 많은 같은 것을 원하는 것처럼

things GET /things(.:format)   {:action=>"index", :controller=>"things"} 
      POST /things(.:format)   {:action=>"create", :controller=>"things"} 
new_thing GET /things/new(.:format)  {:action=>"new", :controller=>"things"} 
edit_thing GET /things/:id/edit(.:format) {:action=>"edit", :controller=>"things"} 
    thing GET /things/:id(.:format)  {:action=>"show", :controller=>"things"} 
      PUT /things/:id(.:format)  {:action=>"update", :controller=>"things"} 
      DELETE /things/:id(.:format)  {:action=>"destroy", :controller=>"things"} 

그것은 소리 : 여기 rake routes의 출력입니다

POST를 올바른 경로로 만들려면 양식을 수정해야합니다.

당신이 질문에 가지고있는 URL에 대한 설명이 옳지 않다고 말하고있는 것이 전부입니다. 다음 목록 : 새 thing (/things/new에서 제출 양식) 양식을 다시 제출하라는 메시지를 다시 클릭 /things

  • -/things/new에서

    1. 의 URL 변경을 제출 한 후
    2. 새로 고침는 things#index
    을 보여줍니다

    이것은 이 아니며 내 Rails 3 응용 프로그램에서 경험 한 기능입니다.대신에, 나는 발견한다 : 새로운 thing (/things/new에서 제출 한 형태), /things-/things/new에서

    1. 의 URL 변경 (이 동일)
    2. 다시 클릭이 에 사용자를 다시 소요 제출 후 비 -submitted 형태 (재 게시물에 대한 어떠한 요청)
    3. 상쾌한 프롬프트 (내 의견으로는 예상대로) 나는이 오래된 질문 알고
  • +1

    Brandon에게 감사드립니다. 이 기능은 유용하지만 기본 기능은 여전히 ​​신경 쓰지 않습니다. 나는 자바 스크립트 유효성 검사를 가능한 한 많이 사용하지 않을 것이라고 생각한다. – dearlbry

    0

    을 양식을 다시 제출, 이에 최근에 내가 해왔 던 한 가지 접근법은 AJAX가 필요하지 않더라도 AJAX로 양식을 제출하는 것입니다. 이렇게하면 경로가 이동하는 한 기본 작성/업데이트 조치로 제출할 수 있지만 브라우저의 URL은 변경되지 않습니다. 응답은/index 페이지로의 링크 또는 성공한 저장으로 리디렉션되는 모든 곳에서의 성공에 대한 간단한 200 또는 데이터가 유효하지 않은 경우 오류 메시지가있는 "400 잘못된 요청"일 수 있습니다.

    가장 큰 오류는 오류 메시지와 유효하지 않은 필드의 표시가 전적으로 고객 측 자바 스크립트의 책임이라는 것입니다. 이것은 훨씬 더 작은 문제가되고 클라이언트 측에서 Backbone이나 KnockoutJS와 같은 것을 사용하면 좋을 수도 있습니다.

    관련 문제