2012-05-12 4 views
0

Railscast에 이어 자동 완성 연결을 설정하고 있습니다.유효성 검사 오류와 양식 리디렉션에서 가상 속성을 유지하는 방법은 무엇입니까?

다른 논리를 통해 값을 전달해야하므로 virtual category_name 속성에 find_or_create 대신 find_or_initialize을 사용하고 있습니다.

상위 모델 유효성 검사가 실패한 경우 (railscast의 제품)이 가상 속성을 유지하는 가장 좋은 방법은 무엇입니까? 오류가있는 경우 저장 경로가 양식을 렌더링 한 후 사용자가 입력 한 category_name을 입력하고 싶습니다.

값이 params[:category_name]을 통해 액세스 할 수 있다고 생각했지만 다시 필드로 설정할 수 없습니다.

아이디어에 감사드립니다.

편집

컨트롤러

class ProductsController < ApplicationController 

    ... 

    def create 
    @product = current_user.products.build(params[:prerep]) 

    if @products.save 
     DO SOME STUFF... 

     respond_to do |format| 
     format.html { redirect_to(@product, :notice => 'Product was successfully created.') } 
     format.xml { render :xml => @product, :status => :created, :location => @product } 
     end 

    else 
     respond_to do |format| 
     format.html { render :action => "new" } 
     format.xml { render :xml => @product.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 
end 

모델 :

class Prerep < ActiveRecord::Base 
    attr_accessible ..., :category_name, ... 
    attr_reader ... 
    attr_accessor ... 

    belongs_to :user, :category 

    has_many ... 

    validates ... 

    def category_name 
    category.try(:name) 
    end 

    def category_name=(name) 
    product_category = Category.find_or_initialize_by_name(name) if name.present? 
    self.category = if product_category.new_record? 
     product_category ...SET SOME ATTRIBUTES... 
     product_category.save(:validate => false) 
     product_category 
    else 
     product_category 
    end 
    end 
end 
+1

문제는 리디렉션입니다. 왜 대신 렌더링 할 수 없습니까? – apneadiving

+0

안녕하세요, @ 가난하게 말한 질문에 사과드립니다. 컨트롤러는 실제로 리다이렉션하지 않고 eror에 양식을 렌더링합니다. 이를 반영하기 위해 질문을 업데이트했습니다. –

+0

동일한 문제가 있습니다. 그것을 해결 했습니까? – Raoot

답변

0
나는 내가 똑같은 문제가 있습니다 때문에이 질문에 대답 것 내가 하나를 찾을 수 없습니다 생각

대답.

가장 좋은 방법은 유효성을 검사해야하는 모든 항목을 수동으로 확인하는 것입니다. 따라서 validates 필터를 사용하는 대신 컨트롤러에서 직접 필터를 사용해야합니다. 따라서 특성이 사용자 이름, 전화 번호 및 이메일 인 경우 모델에서 validates :email, presence: true을 수행하지 말고 컨트롤러에서 수동으로 수행하십시오. 이렇게하면 추가 매개 변수가있는 경우 컨트롤러 나 도우미에 다른 유효성 검사 메서드를 추가하여 유효성 검사를 수행하면이 유효성 검사를 유지할 수 있습니다.

이 방법을 사용하면 문제를 해결하는 데 더 쉬운 방법이없는 것처럼 보이기 때문에 사람들의 시간을 절약 할 수 있기를 바랍니다. 레일이 이미 개발 시간을 많이 늘리고, 코드 몇 줄이 우리를 죽이지는 않을 것입니다.)