1

私の Rails アプリでは、Timesheet has_many Entries で、Entry は Timesheet に属しています。

class Timesheet < ActiveRecord::Base
  has_many :entries, order: 'position', dependent: :destroy
end


class Entry < ActiveRecord::Base
  belongs_to :timesheet
end

ソート可能なリスト(更新されたバージョン)については、Railscast 147に従っています。開発ログで、params ハッシュがソート順を正しく更新していることに気付きましたが、リロード時に位置が正しく保存されません。さらに、カスタムソートアクションではなく、作成アクションによってリクエストが処理されています。これが私のコントローラーです。

class EntriesController < ApplicationController
  before_filter :signed_in_user
  before_filter :find_timesheet

  def index
    @entries = @timesheet.entries.order("position")
    @entry = @timesheet.entries.build
  end

  def create
    @entry = @timesheet.entries.build(params[:entry])
    @entry.position = @timesheet.entries.count + 1
    if @entry.save
      #flash[:notice] = "Entry created"
      #redirect_to timesheet_entries_path
      respond_to do |format|
        format.html { redirect_to timesheet_entries_path }
        format.js
      end
    else
      flash[:alert] = "Entry could not be added"
      render 'new'
    end
  end

  def destroy
    @entry = @timesheet.entries.find(params[:id])
    @entry.destroy
    respond_to do |format|
      format.html { redirect_to timesheet_entries_path, flash[:notice] = "Entry destroyed" }
      format.js
    end
  end

  def sort
    params[:entry].each_with_index do |id, index|
      @timesheet.entries.update_all({position: index+1}, {id: id})
    end
    render nothing: true
  end

  private

    def find_timesheet
      @timesheet = Timesheet.find(params[:timesheet_id])
    end  
end

そして私のroutes.rbファイル。

Sledsheet::Application.routes.draw do

  resources :timesheets do
    resources :entries, only: [:index, :create, :destroy] do
      collection { post :sort }
    end
  end
end

エントリー.js.コーヒー

jQuery -> 
    $("#entries tbody").sortable(
        helper: fixHelper
        update: ->
            $.post($(this).data('update-url'), $(this).sortable('serialize'))
    ).disableSelection()

開発ログからの出力

Started POST "/timesheets/8/entries" for 127.0.0.1 at 2012-06-04 20:14:18 -0400
Processing by EntriesController#create as */*
  Parameters: {"entry"=>["60", "59", "61"], "timesheet_id"=>"8"}
  User Load (0.2ms)  SELECT "users".* FROM "users" WHERE "users"."remember_token" = 'qDs53hgOWfRMbNN9JKau3w' LIMIT 1
  Timesheet Load (0.1ms)  SELECT "timesheets".* FROM "timesheets" WHERE "timesheets"."id" = ? ORDER BY date DESC LIMIT 1  [["id", "8"]]
Completed 500 Internal Server Error in 2ms

NoMethodError (undefined method `stringify_keys' for "60":String):
  app/controllers/entries_controller.rb:11:in `create'

未定義のメソッドに関するエラーをグーグルで検索しましたが、とにかくこの場合に create アクションが呼び出される理由がわかりません。ページに new_entry フォームがあり、Ajax を介して新しいエントリを作成します。おそらく、これはソートを妨げていますか?どんな助けでも大歓迎です!

4

1 に答える 1

0

「stringify_keys」メソッドがない理由は、並べ替えアクションではなく作成アクションに配列を渡しているためです。data-update-urlあなたの erb.html ファイルには何がありますか? する必要がありますsort_entries_path

于 2012-06-05T03:26:45.150 に答える