2012-06-05 2 views
1

В моем приложении rails, Timesheet has_many Записи и запись принадлежат_писанию.Сортировка таблицы строк с вложенным ресурсом

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


class Entry < ActiveRecord::Base 
    belongs_to :timesheet 
end 

Я следую за Railscast 147 для сортируемых списков (обновленная версия). В журнале разработки я замечаю, что хеш моих параметров корректно обновляет порядок сортировки, но при перезагрузке он не сохраняет позиции правильно. Кроме того, запрос обрабатывается действием create вместо моего пользовательского действия сортировки. Вот мой контроллер.

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 

и my routes.rb.

Sledsheet::Application.routes.draw do 

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

entries.js.coffee

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' 

Я гугл ошибки о неопределенном методе, но я запутался, почему создать В любом случае, действие будет вызвано в этом случае? У меня есть страница new_entry на странице, которая создает новую запись через Ajax. Может быть, это мешает подобным? Любая помощь будет оценена!

ответ

0

Причина, по которой метод 'stringify_keys' отсутствует, - , потому что вы передаете массив действию create, а не действию сортировки. Что у вас есть для data-update-url в файле erb.html? Должно быть sort_entries_path.

+0

data-update-url is sort_timesheet_entries_url, который я считаю правильным URL-адресом в соответствии с рейк-маршрутами – jktress

+0

Я все еще не уверен, почему он собирается создать действие, но я бы сказал, что вам нужно получить '@ timesheet' в какой-то момент в действии вида. Поэтому включите 'timesheet_id' в params, а затем используйте метод' find_timesheet'. – evanbikes

Смежные вопросы