2013-09-21 1 views
0

제 목표는 collection_select에서 항목의 선택을 취소하고 저장된 레코드를 다시 업데이트 할 수있게하는 것입니다. 그러면 해당 레코드가 다시 제출됩니다. 도움을 위해 미리 감사드립니다!Rails에서 collection_select로 저장된 레코드를 삭제하려면 어떻게해야합니까?

세부

나는 Newsavedmaps에 대한 양식을 가지고있다. Newsavedmaps에는 많은 웨이 포인트가있을 수 있습니다. 사용자는 collection_select에서 웨이 포인트를 선택할 수 있으며, Newsavedmap을 저장할 때이 웨이 포인트는 자체 데이터베이스 테이블에 저장됩니다.

문제 : 사용자가 저장 한 Newsavedmap을 열면 웨이 포인트를 선택 취소 할 수 있기를 바랍니다. 그들이 Newsavedmap을 다시 저장할 때, 선택 해제 된 웨이 포인트를 지우고 싶습니다.

이것은 내가 유지하고있는 Rails 2.3X 앱입니다. 이것이 collection_select가 아래 다른 형식을 사용하는 이유입니다.

모델

class Newsavedmap < ActiveRecord::Base 
    belongs_to :itinerary 
    has_many :waypoints, :dependent => :destroy 
    accepts_nested_attributes_for :waypoints, :reject_if => lambda { |a| a[:waypointaddress].blank? }, :allow_destroy => true 
end 

보기

<% form_for @newsavedmap, :html => { :id => 'createaMap' } do |f| %> 
     <%= f.error_messages %>    
     <%= f.text_field :name, {:id=>"savemap_name", :size=>30 }%></p> 

     <%= collection_select :waypoints, :waypointaddress, @newsavedmap.waypoints, :waypointaddress, :waypointaddress, {}, { :multiple => true, :class => "mobile-waypoints-remove", :id =>"waypoints" } %> 

    <% end %> 

Newsavedmaps 컨트롤러

def create 
    @newsavedmap = Newsavedmap.new(params[:newsavedmap]) 
    waypoint = @newsavedmap.waypoints.build 

    respond_to do |format| 
    if @newsavedmap.save 
     flash[:notice] = 'The new map was successfully created.' 
     format.html { redirect_to "MYURL"} 
     format.xml { render :xml => @newsavedmap, :status => :created, :location => @newsavedmap } 
    else 
     format.html { render :action => "new" } 
     format.xml { render :xml => @newsavedmap.errors, :status => :unprocessable_entity } 
    end 
    end 
end 


def update 
    @newsavedmap = Newsavedmap.find(params[:id]) 

    if @newsavedmap.itinerary.user_id == current_user.id 
    respond_to do |format| 
     if @newsavedmap.update_attributes(params[:newsavedmap]) 
     flash[:notice] = 'Newsavedmap was successfully updated.' 
     format.html { redirect_to "MYURL" } 
     format.xml { head :ok } 
     else 
     format.html { render :action => "edit" } 
     format.xml { render :xml => @newsavedmap.errors, :status => :unprocessable_entity } 
     end 
    end 
    else 
    redirect_to '/' 
    end 
end 

에 Params는 새로운 기록을

매개 변수를 만들 때 : { "newsavedmap"=> { "이름"=> "내지도의 이름", 다른 필드는, 위의 "중간 점"을 표시되지 않음 => { "waypointaddress"=> [ "1600 Pennsylvania Ave NW, Washington, DC 20500", "350 5th Ave, New York, NY 10118"]}}

+0

당신이 양식 – gotva

+0

추가에서 오는 PARAMS을 게시 할 수있는 방법이 될 것입니다. 밝혀 졌 듯이 위의 그림은 웨이 포인트 데이터베이스에 하나의 새로운 빈 레코드를 생성하는 것입니다 (두 개의 웨이 포인트 레코드 각각 하나의 주소가 있음). 컨트롤러가 웨이 포인트를 작성할 때마다 Newsavedmap. 그러나 데이터를 완전히 무시하고 있습니다. 어떤 아이디어? – KDP

+0

DB에 빈 레코드에 대한 : 당신 말이 맞아. 'create' 메쏘드에서 params로부터 새로운'@ newsavedmap'을 초기화하고, 새로운 waypoints를 만들고 @newsavedmap을 저장합니다. 이것은 @newsavedmap과 내장 된 중간 점을 저장합니다. 메소드에서 웨이 포인트를 위해이 건물을 제거하십시오. – gotva

답변

0

문제는 올바르게 작성된 양식 (및 그로부터 오는 매개 변수)에 있다고 생각합니다.

나는

  • 이 양식
  • 그리고 레일에 보석에서 (포인트 # 1) 도우미를 구현 attr_accessible하는

    1. 보석 cocoon 봐 또는 nested_form
    2. waypoints_attributes을 추가로 제안 마술은 다른 일을해야한다

    +0

    응답 해 주셔서 감사합니다, gotva. 불행히도, 나는 보석에 의지 할 수 없다. 그러나 나는 질문을 가지고 있었다. 어쨌든 attr_accessible을 포함시켜야 할 필요가 있겠는가? 그렇다면 어디로 간다? – KDP

    +0

    about gems : 나는 보석없이'accept_nested_attributes'를위한 양식을 올바르게 만드는 것이 어려울 것이라고 생각합니다. 'attr_accessible'에 대해서 : 필요는 없습니다. 그러나이 경우에는 수동으로 매개 변수를 지정하는 것에 신경 써야합니다. @ newsavedmap.waypoints_attributes = params [: newsavedmap] [: waypoints_attributes]와 같습니다. 'attr_accessible'을 추가하려면'Newsavedmap'을 모델에 추가하십시오 (그리고 attr_accessible가 설정되어 있지 않으면 모든 속성이 기본적으로이 목록에 있음을 기억하십시오) – gotva

    +0

    고맙습니다, Gotva! 나는 attr_accessible을 건너 뛸 것이다. 귀하의 의견을 읽었지만, 중첩 된 양식을 사용하는 보석없이 collection_select를 사용하여 레코드를 추가하고 제거하는 방법이 있어야합니다. 어떤 아이디어? – KDP

    0

    다른 변형 (보석을 사용하지 않고) (나는 훨씬 더 어려운 방법이라고 생각합니다!)

    accept_nested_attributes을 제거하고 직접 매개 변수로 작업 할 수 있습니다. 그러나이 경우 수동으로 모든 프로세스를 관리해야합니다. 올바른 레코드 삽입, 올바른 파괴.

    귀하의 경우에는 이렇게해야합니다 (테스트되지 않았습니다!). 이 질문에 게시 한 매개 변수를 기반으로 한 예입니다.

    def create 
        # delete params 'waypoints' it will be manage manually 
        waypoints = params[:newsavedmap].delete(:waypoints) 
        @newsavedmap = Newsavedmap.new(params[:newsavedmap]) 
        waypoints.each do |waypoint| 
        @newsavedmap.waypoints.build(:waypointaddress => waypoint) 
        end 
        if @newsavedmap.save 
        ... 
        end 
    end 
    

    주요 문제는 update

    def update 
        # delete params 'waypoints' it will be manage manually 
        waypoints = params[:newsavedmap].delete(:waypoints) 
    
        # find and setup attributes 
        @newsavedmap = Newsavedmap.find(params[:id]) 
        @newsavedmap.attributes = params[:newsavedmap] 
    
        # TROUBLES start here 
        # destroy not checked (but existed in DB) waypoints 
        existed_waypoints = @newsavedmap.waypoints 
        existed_waypoint_addresses = existed_waypoints.map(&:waypointaddress) 
        new_waypoints = [] 
        waypoints.each do |waypoint| 
        if existed_waypoint_addresses.include?(waypoint) 
         # existed waypoint was selected on the form 
         # find it and add to new_waypoints 
         new_waypoints << @newsavedmap.waypoints.find_by_waypointaddress(waypoint) 
        else 
         # new waypoint was selected on the form 
         # build it and add to new_waypoints 
         new_waypoints << @newsavedmap.waypoints.build(:waypointaddress => waypoint) 
        end 
        end 
        # setup new records for waypoints 
        @newsavedmap.waypoints = new_waypoints 
    
        if @newsavedmap.save 
        # destroy existed but not selected waypoints 
        (existed_waypoints - new_waypoints).map(&:destroy) 
        ... 
        end 
    end 
    
    +0

    Gotva, 정말 고맙습니다. 그러나, 나는 그들 주위를 돌아 다니려고하기보다는 여기에서 중첩 된 형태로 작업하고 싶습니다. collection_select를 사용하여 레코드를 추가하고 제거하는 방법이 있어야합니다. – KDP

    관련 문제