2012-06-30 2 views
1

UPDATE루비 레일 모델 방식에 '새로운'동의하지 않는다 추가 매개 변수

내가 아래에있는 내 질문에 대답,하지만 난 여전히 내 목표를 달성하기 위해 더 예쁜 방식을 요구하고있다. 내 컨트롤러에 대해 너무 많이 알고있는 느낌이 있습니다 일을하는 방법. . 나는 사용자가 채워 양식에서 해당 정보를 얻을 수와 params[:video]와 Video.new 전화

def create 
    method = 'get_' + params[:video][:provider] + '_video_id' 
    provider_video_id = Video.send(method, params[:video][:url]) 
    thumb = Video.get_thumb_from_youtube(provider_video_id) 

    @video = Video.new(params[:video], :provider_video_id => provider_video_id, :thumb => thumb, :views => 0, :likes => 0) 
    if @video.save! 
    redirect_to video_path('1'), notice:'Video added successfully.' 
    else 
    render :new 
    end 
end 

내가 다음 URL을 조작하는 사용자가 통과 : 내 동영상 컨트롤러에서 생성 작업을 한


video_provider_idthumb을 복구하는 형식으로

그러나, 레일 provider_video_idthumb과 함께 동영상을 저장하지 않습니다 ... 나는 저장에이 오류를 얻을 :

Validation failed: Thumb can't be blank, Thumb is invalid, Provider video can't be blank

내 생각 엔 추가 매개 변수를 허용하지 않는 new 방법입니다 ...

답변

0

나는이 문제를 해결했다. 나는 Ruby on Rails의 new 메소드가 두 개 이상의 파라미터를 허용하지 않는다고 생각한다. 보통 하나의 파라미터는 params이다. 내가 한 일은 다음과 같습니다.

이제는 작동하는 것 같습니다.

1

모델에 저장하기 전 콜백은 어떨까요? 이것은 필자의 머리가 아닌 기본값이다.하지만 매개 변수도 전달할 수있다.

after_initialize :url 


private 
def url 
    self.provider_video_id ||= "default value" 
end 
+0

당신의 솔루션은 좋아 보이지만 잘 이해하고 있는지 확신 할 수 없습니다. 나는 provider_video_id를 얻기위한 메소드를 호출 할 필요가 있기 때문에 다음과 같이 쓸 수있다 :'self.provider_video_id = get_provider_video_id (params [: video] [: url]'? –

1

하지만 당신이 원한다면, 당신은 항상

+0

좋은 솔루션이지만, 내가 찾던 것이 정확하지 않다. lot! –

1

당신은 .merge() 사용할 수 있습니다

class Video 

    def new(attr1, attr2) 
    super 
    #do something with attr2 
    end 

end 

환호와 같은 뭔가 기본 새로운 액션을 재정의 할 수

대신

method = 'get_' + params[:video][:provider] + '_video_id' 
params[:video][:provider_video_id] = Video.send(method, params[:video][:url]) 
params[:video][:thumb] = Video.get_thumb_from_youtube(params[:video][:provider_video_id]) 
params[:video][:views] = params[:video][:likes] = 0  

@video = Video.new(params[:video]) 

당신은 (원래의 질문에서 코드를 수정) 할 수있는 하나 개의 해시에 PARAMS을 병합합니다

@video = Video.new(params[:video].merge(:provider_video_id => provider_video_id, :thumb => thumb, :views => 0, :likes => 0)) 

.

+0

맞습니다. 지금은 훨씬 더 읽기 쉽습니다! –