У меня есть простой URL, который будет переключать одно поле в моей модели поиска. (заблокировано) Я хочу переключить это поле, нажав на ссылку.
пример:
http://localhost:3000/search/toggle/fe5c72164908af20a7727f324e2fdbc1
Ссылка отлично работает для одного звонка, а затем выдает следующую ошибку:
undefined method `locked' for nil:NilClass
путь переключения просто указывает на метод обновления поиска:
Маршрут:
map.connect 'search/toggle/:id', :controller => 'searches', :action => 'update'
Действие обновления выглядит так:
def update
@search = Search.find_by_permalink(params[:id])
if @search.locked == 1 then
@search.locked = 0
else
@search.locked = 1
end
respond_to do |format|
if @search.update_attributes(params[:search])
flash[:notice] = 'Search was successfully updated.'
format.xml { head :ok }
format.js
else
format.html { redirect_to('/users/current') }
format.js
end
end
end
У меня также вызов ajax выглядит так:
$j('a.lock-status').live('click', function(e) {
$j.get($j(this).attr('href'));
e.preventDefault();
});
Подведем итог:
Если я введу URL-адрес переключателя в адресную строку браузера, он будет работать один раз. Если я нажму «Обновить», произойдет сбой, и появится сообщение об ошибке выше.
Если я использую ajax-вызов, он срабатывает один раз.
Если я использую ajax-вызов, а затем обновлю страницу, он будет работать для этого первого запроса каждый раз.
У меня такое чувство, что это может быть связано с запросами GET / POST в рельсах, но я не уверен? Я сузил его до:
@search = Search.find_by_permalink(params[:id])
перенастроить nill на любой вызов после первого, но я не уверен, почему он это делает?
ОБНОВЛЕНИЕ 1:
Вот вывод журнала для 2 запросов. (1-ые работы, 2-ые неудачи):
Processing SearchesController#update (for 127.0.0.1 at 2011-06-13 16:19:39) [GET]
Parameters: {"action"=>"update", "id"=>"9036304997196d83b20cba82a0cc67b8", "controller"=>"searches"}
Search Columns (1.0ms) SHOW FIELDS FROM `searches`
Search Load (0.4ms) SELECT * FROM `searches` WHERE (`searches`.`permalink` = '9036304997196d83b20cba82a0cc67b8') LIMIT 1
SQL (0.1ms) BEGIN
Search Update (0.2ms) UPDATE `searches` SET `locked` = 1, `updated_at` = '2011-06-13 23:19:39', `permalink` = '97894f26ba36761d04575260b132c230' WHERE `id` = 282
SQL (0.3ms) COMMIT
Rendering searches/update
Completed in 17ms (View: 6, DB: 2) | 200 OK [http://localhost/search/toggle/9036304997196d83b20cba82a0cc67b8]
SQL (0.1ms) SET NAMES 'utf8'
SQL (0.1ms) SET SQL_AUTO_IS_NULL=0
Processing SearchesController#update (for 127.0.0.1 at 2011-06-13 16:19:41) [GET]
Parameters: {"action"=>"update", "id"=>"9036304997196d83b20cba82a0cc67b8", "controller"=>"searches"}
Search Columns (1.0ms) SHOW FIELDS FROM `searches`
Search Load (0.4ms) SELECT * FROM `searches` WHERE (`searches`.`permalink` = '9036304997196d83b20cba82a0cc67b8') LIMIT 1
NoMethodError (undefined method `locked' for nil:NilClass):
app/controllers/searches_controller.rb:84:in `update'
/Users/Nick/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/webrick/httpserver.rb:104:in `service'
/Users/Nick/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/webrick/httpserver.rb:65:in `run'
/Users/Nick/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/webrick/server.rb:173:in `start_thread'
/Users/Nick/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/webrick/server.rb:162:in `start'
/Users/Nick/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/webrick/server.rb:162:in `start_thread'
/Users/Nick/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/webrick/server.rb:95:in `start'
/Users/Nick/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/webrick/server.rb:92:in `each'
/Users/Nick/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/webrick/server.rb:92:in `start'
/Users/Nick/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/webrick/server.rb:23:in `start'
/Users/Nick/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/webrick/server.rb:82:in `start'
Rendered rescues/_trace (109.8ms)
Rendered rescues/_request_and_response (1.1ms)
Rendering rescues/layout (internal_server_error)
ОБНОВЛЕНИЕ 2:
Хорошо, я понимаю, что вы, ребята, говорите ... не уверен, что изменит постоянную ссылку. Я собираюсь дважды проверить код модели в AM.
Спасибо!