2010-12-11 2 views
1

매우 간단한 소셜 네트워크를 만들고 싶습니다. 필자는 User (Devise gem 사용)와 그의 Profile이라는 두 가지 모델로 시작했습니다. 그들은 1 대 1의 관계로 연결되어, 그래서 내 경로는 다음과 같다 :Rails 3의 단일 리소스 모델에 유효성 검사를 추가 할 수 없습니다.

resources :users do 
    resource :profile 
end 

내가 적절한 컨트롤러가 - 여기에 프로파일을 생성하기위한 코드 (편집이 거의 동일)입니다 :

def new 
    @profile = current_user.create_profile 
end 

def create 
    @profile = current_user.profile.create(params[:profile]) 
    if @profile.save 
     redirect_to user_profile_path(current_user) 
    else 
     render :action => "new" 
    end 
end 

사용자가 주소 표시 줄에 무엇을 입력했는지에 관계없이 다른 사용자의 프로필을 만들 수 없으므로 current_user 변수를 사용했습니다. 나는 형태있어 '새'보기에서

: 내가 기대했던대로 작동하고

- form_for [@profile.user, @profile] do |p| 
    (fields omitted) 

- 사용자가 프로필에 자신의 데이터를 추가 할 수 있습니다 타격 후 "저장은"새로 만든 자신의 리디렉션됩니다 페이지. 나는 (validates_presence_of처럼, 심지어 간단한 것들) 프로필 모델에 약간의 검증을 추가 한 다음 새 프로필을 만들려고 할 때, 내 컨트롤러 나에게 오류 보여줍니다

undefined method `user_profiles_path' for #<#<Class:0xb2d3e5c>:0xb2d2728> 

Extracted source (around line #1): 
1: - form_for [@profile.user, @profile] do |p| 

그것은, 이상하다을하지만,이 문제가되지 않습니다 새로운 프로필을 만들려고 할 때만 프로필 정보를 업데이트 할 때 발생합니다. form_for 도우미에서 리디렉션 URL을 지정하라는 해결책을 봤습니다. 그래서 내 견해로 변경했습니다 :

- form_for [@profile.user, @profile], :url => user_profile_path(@profile.user) do |p| 

여전히 작동하지 않습니다.

undefined method `create' for nil:NilClass 

내가조차 찾을 : 그것은 내가 원하는 뷰가 표시됩니다 (오른쪽 시작부터 유효성 검사 오류 메시지를,하지만 난 ;-) 그와 함께 살 수), 그러나 타격 후 "저장"그것은 또 다른 문제를 발생 더 이상한, 오류 세부 정보의 매개 변수 개체를 표시하기 때문에 올바른 데이터를 포함하고 모든 것이지만 nil이 아닙니다. 나는 아이디어가 부족했다. 무엇이 잘못 될 수 있는지.

조금 궁금합니다. 내 문제의 원인은 무엇이며이를 수정하는 방법은 무엇입니까?

미리 감사드립니다.

+0

시간에 하나의 질문을하지 말아주세요 –

답변

0

시도

액션을 만들에
@profile = current_user.create_profile(params[:profile]) 

- 대신 .profile.create의

+0

그것은 "create_profile"을 찾을 수없는 "nil"에 대한 "정의되지 않은 메소드"를 여전히 계속 말합니다. – Elrosa

+0

그럴 경우 current_user는 소리가 나지 않습니다. – Cory

0

나는 다음과 같은 제안 :

# user.rb 
    def initialize(*params) 
    super(*params) 
    self.build_profile unless self.profile 
    end 
0

첫째 : CURRENT_USER이 있는지 확인 필요 사용자는 로그인해야합니다.

두 번째 : 프로파일이 지속되지 않으므로 new에 대해 user_profiles_path 메소드가 표시됩니다. 이 경우 레일에있는 URL 생성 방법이 복수화됩니다. 올바른 URL을 항상 원한다면 [@profile.user, :profile]을 사용하십시오. 사용자 당 프로필이 하나뿐이므로 프로필 ID가 필요하지 않으므로이 작업을 수행 할 수 있습니다.셋째

: 당신의 생성 작용에 대체

@profile = current_user.profile.create(params[:profile]) 
# with 
@profile = current_user.build_profile(params[:profile]) 

마지막 : 생성 및 프로파일을 편집 사이의 차이를 가지고 있지 고려합니다. 최종 사용자에게는 아무런 차이가 없습니다. 비어있는 프로필이없는 경우를 대비하여 필터 전에 이전 프로필을 추가 ​​할 수 있습니다. 또한 코드가 적어집니다. 유지하기 위해

관련 문제