2017-11-24 7 views
0

私のレールアプリではネストされた属性があります。私はjquery-ui-sortableを使ってネストされたフィールドセットをソートしています。Ruby on Rails - jquery-ui-sortableでソートするときにネストされた属性をソートしたい

フォームの送信時に、ソート順を維持し、編集モードで開くときにこのフィールドセットを表示する必要があります。私は各入れ子フィールドのソートされた位置をデータベースに保存したい。

私はacts_as_list宝石を試しましたが、動作させることができませんでした。私は現在、次のロジックを使用しており、正常に動作します。

このロジックが正しいかどうかを知りたいです。親切にあなたの提案をしてください。事前にお返事いただきありがとうございます。

ロジックは次のとおりです。

  1. 私は、各フィールド・セットのテーブル列positionを持っていると私のモデルで default_scope { order("position ASC") }
  2. フォームが送信されると、コントローラは生のparamsを取得しています。更新する前に、私は、フィールドごとに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 

にですうまく動作しますが、正しい方法でこれを実行しているかどうかを知りたいのです。

答えて

0

ここに便利かもしれないいくつかのことがあります。

まず、あなたはparams[:job][:fields_attributes]を反復処理するeach_with_indexを使用することができます - のようなもの:

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にお返事ありがとうございます。私のコードで更新されました。再度、感謝します。 –

関連する問題