2011-01-22 3 views
0

사용자는 많은 웹 사이트를 보유하고 있으며 웹 사이트에는 많은 키워드가 있습니다. (웹 사이트 리소스의 중첩 된 리소스 인 키워드)텍스트 영역의 각 행에 대해 새 모델의 유효성을 검사하고 만드는 방법

지금은 기본 스캐 폴딩 설정으로 한 번에 많은 키워드를 추가하는 것이 매우 지루합니다. 텍스트 필드 대신 텍스트 영역을 사용하여 사용자가 여러 키워드를 입력 할 수있게하고 각 키워드를 한 번에 제출할 수 있습니다. 양식의 유일한 입력은 키워드의 "텍스트"열에 대한 것입니다.

어떻게하면됩니까?

나는 params[:keyword][:text].split("\r\n").each do |text|과 같은 것을 알아낼 수는 있지만 레일스 양식과 상호 작용하는 방법을 모르겠습니다.

<%= form_for [@website, @keyword] do |f| %> 
    <% if @keyword.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(@keyword.errors.count, "error") %> prohibited this keyword from being saved:</h2> 

     <ul> 
     <% @keyword.errors.full_messages.each do |msg| %> 
     <li><%= msg %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 

    <div class="field"> 
    <%= f.label :text %><br /> 
    <%= f.text_area :text %> 
    </div> 

    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

답변

0

(참고 : 저는 원래 편집으로 원래의 게시물에이 붙어, 그래서 가장 좋은 대답은 그래서 내가 대신 복사 및 붙여 넣은)

가 여기에 내가 한편에서 일을 결국거야. (루비 멍청한 놈입니다.) 실수 한 키워드를 저장하고 실패한 키워드 목록을 사용하여 "new"를 다시 렌더링합니다 :

# keywords_controller 
def create 
    invalid_keywords = [] 
    valid_keywords = [] 
    params[:keyword][:text].split("\r\n").map(&:strip).delete_if {|text| text == ""}.each do |text| 
     keyword = @website.keywords.new(:text => text.downcase) 
     if keyword.save 
     valid_keywords << keyword 
     else 
     invalid_keywords << keyword 
     end 
    end 

    if invalid_keywords.empty? # All keywords saved 
     redirect_to @website, :notice => "Keyword(s) added" 
    else # These keywords didn't save 
     @keyword = @website.keywords.new(:text => invalid_keywords.map(&:text).join("\r\n")) 
     @errors = invalid_keywords.first.errors 
     flash[:success] = "#{valid_keywords.count} keywords were saved" 
     flash[:alert] = "#{invalid_keywords.count} keywords did not save (shown below)" 
     render :action => "new" 
    end 
end 
1

키워드를 쉼표로 구분하여 분석하는 것이 고려 되었습니까 (키워드가 단일 단어 인 경우 spaces도 포함)? 적어도 내 경험은 이것이 더 일반적이라고 생각합니다.

쉼표로는 line.split(',')과 같이 간단합니다.

그리고 쉼표 후 & 전에 공백을 제거하려면 : line.split(/\s*,\s*/)또는line.split(',').map{|k| k.strip}.