2009-11-19 2 views
0

현재 3 개의 테이블이 있습니다.HABTM에 사용 된 양식을 저장하기 전에 무엇인가하기

조각 태그 snippet_tags

내가 HABTM를 사용하고

.

태그를 사용하여 스 니펫을 저장하는 양식을 만들었습니다. 키워드는 쉼표로 구분 된 텍스트 입력란에 있습니다.

내가해야 할 일은이 텍스트 필드에서 문자열을 가져 와서 키워드를 반복하고, 키워드가 존재하는지 확인하고, 작성하지 않았 으면 확인한 다음 스 니펫을 저장하는 것입니다. 당신이 나를 도울 수 있다면

나는 before_save으로 시도했지만 그런 식으로 이동하지 않는 것

..

그래서, 그것은 좋은 거라고!

고맙습니다.

답변

2

나는 JosephL의 대답이 꽤 좋다고 생각한다. 그래도 나는 snippets_controller 액션에서이 모든 작업을 수행합니다.

def create 
    @snippet = Snippet.new(params[:snippet]) 

    @snippet.tags = params[:tags].split(',').collect { |tag| Tag.find_or_create_by_name(tag) } 

    if @snippet.save 
    # do something when successful 
    else 
    # do something when saving failed 
    end 
end 

죄송합니다. 한 줄짜리 진술입니다. ;-)

코드를 테스트하지 않았지만 제대로 작동하기를 바랍니다.
Tag.find_or_create_by_name 정확히 그 일을 할 것입니다 : 그 이름을 가진 태그가 존재하면 그것을 돌려 줄 것이고, 그렇지 않으면 그 태그는 즉석에서 새로운 태그를 만들고 그것을 반환 할 것입니다.
이렇게하면 태그는 이미 에 저장되고 전에 @snippet.save이라고 부릅니다.

변수 및 매개 변수의 이름이 어떻게 지정되었는지 생각해보십시오.

+0

LOL 내 컨트롤러는 다음과 같습니다. http://pastie.org/705756 길을 찾으려합니다. find_or_create 메소드가 있다는 것을 몰랐습니다! 그러나 문제는 다음과 같습니다. snippet.new (params [: snippet]) 할 때마다 ActiveRecord :: AssociationTypeMismatch (태그 (# 2181591060) 예상 됨, 문자열 있음 (# 2148246520)) : app/controllers/snippet_controller.rb : 18 : new in app/controllers/snippet_controller.rb : 18 : 작성 중 도움을 주셔서 감사합니다! – TomShreds

+0

길을가는 길에서도 길을 찾지 않습니다. 그러나 그 아이디어는 훌륭하고 제 모델에 어떤 종류의 문제가있을 것이라고 생각합니다 ... 몰라요. http://pastie.org/705758 – TomShreds

+0

이름 충돌이 의심 될 수도 있습니다. 'params [: snippet]'에': tags' 키가 포함되어 있으면 Rails는 HABTM 연관에서 얻은'tags' 메소드를 사용하여 tags 문자열을 할당하려고 시도합니다. 보내는 양식의 입력란에'snippet [tags]'및'snippet_tags'와 같은 이름과 ID가 없는지 확인하십시오. 이 경우 'f.text_field : tags'와 같은 것을 사용하지 마십시오. 쉼표로 구분 된 태그를 전달하려면'text_field_tag' 메소드를 사용하십시오. 하지만 여기서 추측하고 있습니다. 로그 파일에서 뷰 또는 매개 변수 목록의 코드를 게시 할 수 있다면 도움이됩니다. –

0

시도 before_update?

+0

'before_save'는'before_save'와'before_create'의 조합이므로 도움이되지 않습니다. – samg

1
  1. 사용
  2. 이름으로 각 태그를 찾습니다 태그의 배열로 문자열을 깰 분할
  3. 다음 조각
  4. 저장에 태그 추가 태그
  5. 을 만들 수없는 경우 (컨트롤러)에 조각

예 방법은 당신의 조각 모델에 넣어

,
def add_tags(tag_list_string) 
    tag_array = tag_list_string.split ',' 
    tag_array.each do |tag_name| 
    tag = (Tag.find_by_name(tag_name) || Tag.create(:name => tag_name)) 
    self.tags << tag 
    end 
end 
+0

나는 그 방법과 방법을 알고있다. 하지만 내 컨트롤러에서와 같이해야할 일은 무엇인지 모르겠습니다 ... 그 스 니펫을 저장하는 방법을 알고 싶습니다. 그것은 내게 알기 때문에 ActiveRecord :: AssociationTypeMismatch (Tag (# 2180942420), get got string (# 2148246520)) : – TomShreds

+0

스 니펫 모델에서 컨트롤러 저장 메서드와 add_tags 메서드를 게시 할 수 있습니까? 그러면 무슨 일이 일어나는지 알 수 있습니다. – JosephL

2

다음은 create 방법의 버전입니다. 주요 변경 사항은 Snippet_Tag이 아닙니다. HABTM 연결이 올바르게 설정된 경우 스 니펫에는 태그를 추가 할 수있는 태그 모음이 있습니다. 컬렉션은 ActiveRecord에 의해 Snippet_Tag으로 지속됩니다. HABTM 연결에 대한 자세한 내용은 rails associations guide을 참조하십시오.

def create 
    # Creating the snippet 
    @snippet = Snippet.new 
    @snippet.title = params[:snippet][:title] 
    @snippet.content = params[:snippet][:content] 

    # loop through the tags 
    params[:snippet][:tags].split(',').collect do |tag_string| 
    tag_string.strip! 
    if tag_string.length > 0 
     # Find or create tag 
     tag = Tag.find_or_create_by_name(tag_string) 

     # Add tag to tags collection 
     @snippet.tags << tag 
    end 
    end 

    if @snippet.save 
    # do something when successful 
    else 
    # do something when saving failed 
    end 
end 
관련 문제