В моем приложении 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. Может быть, это мешает подобным? Любая помощь будет оценена!
data-update-url is sort_timesheet_entries_url, который я считаю правильным URL-адресом в соответствии с рейк-маршрутами – jktress
Я все еще не уверен, почему он собирается создать действие, но я бы сказал, что вам нужно получить '@ timesheet' в какой-то момент в действии вида. Поэтому включите 'timesheet_id' в params, а затем используйте метод' find_timesheet'. – evanbikes