2017-11-24 4 views
0

내 레일 앱에 중첩 된 속성이 있습니다. 중첩 된 필드 집합을 정렬하려면 jquery-ui-sortable을 사용하고 있습니다.Ruby on Rails - jquery-ui-sortable을 통해 정렬 할 때 중첩 된 속성을 정렬하고 싶습니다.

양식을 제출할 때 편집 모드로 열 때 정렬 된 순서를 유지하고 필드 세트를 표시하려고합니다. 데이터베이스에 설정된 각 중첩 필드의 정렬 된 위치를 저장하려고합니다.

나는 acts_as_list 보석을 시도했지만 제대로 작동하지 못했습니다. 나는 현재 다음과 같은 논리를 사용하고 있으며 잘 작동합니다.

이 논리가 올바른지 여부를 알고 싶습니다. 친절하게 제안 해주세요. 미리 답변 해 주셔서 감사합니다.

논리는 다음과 같습니다

  1. 나는 각 필드 세트 테이블 열 position이 내 모델
  2. 양식이 제출되면, 컨트롤러는 원시 PARAMS 가져에 default_scope { order("position ASC") } 있습니다. 업데이트하기 전에, 나는 각 필드에 대한 position을 설정하고 추가 처리를 위해 이것을 사용

나는 다음과 같은 원시 PARAMS 수 :

{ 
    "utf8" => "✓", "_method" => "put", "job" => { 
    "name" => "my another test", 
    "fields_attributes" => { 
     "1" => { 
     "field_value" => "Id", 
     "field_id" => "1", 
     "_destroy" => "false", 
     "id" => "9" 
     }, 
     "0" => { 
     "field_value" => "Name", 
     "field_id" => "2", 
     "_destroy" => "false", 
     "id" => "10" 
     } 
    }, 
    "include_header" => "1" 
    }, "search" => "", "controller" => "jobs", "action" => "update", "id" => "4" 
} 
permitted: false 

내 컨트롤러 코드는 다음과 같습니다

before_action :set_position, only: :update 

def update 
    @job = Job.where(id: params[:id]).first 

    if @job.update_attributes(job_params) 
    redirect_to jobs_url 
    end 
end 

def set_position 
    index = 1 
    params[:job][:fields_attributes].each do |f, params| 
    params[:position] = index 
    index += 1 
    end 
end 

def data_job_params 
    params.require(:job).permit(:name, :user_id, :include_header, fields_attributes: %i(id field_value field_id position _destroy)) 
end 

그것은의를 잘 작동하지만 올바른 방법으로이 작업을 수행하고 있는지 여부를 알고 싶습니다. 첫째

당신이 params[:job][:fields_attributes]을 반복하는 each_with_index을 사용할 수 있습니다 - 뭔가 같은 :

답변

0

여기 편리 할 수있는 몇 가지가있다

def set_position 
    params[:job][:fields_attributes].each_with_index do |(f, fieldset_params), i| 
    fieldset_params[:position] = index + 1 # << index starts at 0 
    end 
end 

당신은 또한 알 수 있습니다 각의 열쇠 params[:job][:fields_attributes]에있는 객체는 실제로 해시에있는 객체의 번호이므로, 만약 당신이 행복하다면, 을 다음과 같이 사용할 수 있습니다 :

def set_position 
    params[:job][:fields_attributes].each do |f, fieldset_params| 
    fieldset_params[:position] = f 
    end 
end 

이 두 예제 모두에서 paramsfieldset_params으로 변경했음을 알 수 있습니다. 외부 변수를 섀도 잉하지 않아서 약간의 혼동/잠재적 오류가 저장됩니다.

또한보기 코드에 position의 숨겨진 필드가있을 수 있습니다 (1부터 시작).보기 코드를 포함하도록 질문을 편집하면 어떻게 할 수 있는지 보여줄 수 있습니다.

희망 사항이 있으면 도움이 될 수 있습니다. 어떻게 연락하는지 알려주세요.

+0

@SRack에 감사드립니다. 내 코드로 업데이트되었습니다. 다시 한번 감사드립니다. –

관련 문제