2011-03-15 2 views
0

@users에 대한 편집 양식이 있습니다. 뿐만 아니라 사용자 이름 : 나는로 설정 friendly_id 보석을 사용하는 내 사용자 모델에서빈 필드의 RoutingError가 friendly_id와 충돌합니다.

<%= form_for @user, :url => { :action => "update" } do |f| %> 
<%= render 'shared/error_messages', :target => f.object %> 
<div class="field"> 
    <%= f.label :username %><br /> 
    <%= f.text_field :username %> 
</div> 

을 사용자 이름 : 거기에서 나는 text_field 있습니다. 그래서 내 URL은 domain.com/users/ : username 대신에 : id와 같습니다.

내 응용 프로그램 레이아웃에서는 내 탐색에 @ user.username을 사용하여 프로필에 연결합니다.

저장시 my : username 필드를 비워 두는 경우를 제외하고 모두 제대로 작동합니다. 유효성 확인의 원인을 저장하지 못함.

validates :username, :presence => true, :uniqueness => { :case_sensitive => false }, :length => { :maximum => 50 } 

"수정"을 다시 시도합니다. 그러나 "편집"을 렌더링하기 위해서는 네비게이션 바에 링크를 생성하기위한 사용자 이름이 필요합니다. 그리고 분명히 username => ""으로 전달되었지만, 저장에 실패했기 때문에 적절한 검증이 제대로 이루어 졌음에도 불구하고 말입니다.

def update 
    @user = current_user 
    if @user.update_attributes(params[:user]) 
    flash[:success] = "Account updated." 
    redirect_to :back 
    else 
    @title = "Edit" 
    render "edit" 
    end 

그래서 나는 RoutingError로 끝날 :

No route matches {:action=>"show", :controller=>"users", :id=>#<User id: 6, username: "", persistence_token: "c2f2545659c186131537155347f46f7da5eb0d51b27707e71da...", created_at: "2011-03-14 14:26:48", updated_at: "2011-03-15 01:54:33", email: "[email protected]", crypted_password: "0d6489b1447d278bc4f7c86bab13787f226a10a302b43ec02ff...", password_salt: "Lq2G80iSVeaitB5PDwf", perishable_token: "Tm7Jzyq8QutfaxL3JLZ8", active: true>} 

답변

0

당신은 정말 당신의 유효성 검사가 실패하면 편집 화면을 다시 렌더링 할 필요가 없습니다.

아약스를 사용하여 페이지를 업데이트하고 양식을 제출할 때 remote_form_for (Rails 2) 또는 form_for : remote => true (Rails 3)를 사용하면 더 잘 작동합니다. 그렇게하면 양식이 유효성 검사를 통과하면 수행하려는 것처럼 사용자를 리디렉션 할 수 있지만 유효성 검사가 실패하면 실제로 페이지를 나갈 필요가 없으므로 유효성 검사 메시지를 다시 양식으로 보낼 수 있습니다.

Simone Carletti의 블로그에는 방법에 대한 꽤 괜찮은 예가 있습니다.

http://www.simonecarletti.com/blog/2010/06/unobtrusive-javascript-in-rails-3/

라이언 베이츠뿐만 아니라 그것을 사용하는 방법에 대한 간단한 예를 걸었다. URL 자체가 다른 될 것입니다 때문에 당신이 성공적으로 이름을 변경 가능성이 실패 할 경우에도 다시 : 우선

http://railscasts.com/episodes/205-unobtrusive-javascript

1

는 리디렉션. 따라서해야 할 일은

redirect_to @user 

입니다. 또한

class User < ActiveRecord::Base 
    ... 
    validates_presence_of :username 
    ... 
end 

: 당신이 friendly_id의 기초로 username 필드를 사용하려면

, 다음은 모델에 유효성 검사를 추가하여이 시행 할 수있는, 그것은 공백 못하게 아마 최고입니다 어떤 이유로 애플리케이션을 비워두면 Rails가 이러한 경우 friendly_id가 아닌 숫자 ID를 기반으로 URL을 생성하도록 할 수 있습니다.

이렇게하려면, 당신은 빈보다는 nil에 사용자 이름 값을 설정 한 다음 중 당신은 또한 사용할 수 있습니다이 경우

redirect_to @user 

또는

redirect_to user_url(@user) 

을 할 필요가있을 것이다 :allow_nil => true 옵션은 has_friendly_id입니다.

저는 FriendlyId의 저자입니다. 문제가 해결되지 않으면 FriendlyId의 Google 그룹 또는 개인적으로 [email protected]으로 메시지를 보내 주시면 도와 드리겠습니다. .

관련 문제