Метод обновления контроллера Rails работает только для одного вызова, а затем терпит неудачу? - PullRequest
0 голосов
/ 14 июня 2011

У меня есть простой 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.

Спасибо!

Ответы [ 3 ]

1 голос
/ 14 июня 2011

Как сказал nowk, ваша постоянная ссылка не является постоянным идентификатором записей в вашей таблице поиска.

В первом запросе вы обновляете значение постоянной ссылки, а во втором запросе вы пытаетесь найти запись, используя старое значение постоянной ссылки, которого явно больше не существует.

Ваш контроллер должен проверить на ноль после этой строки: @search = Search.find_by_permalink(params[:id]) Если вы получили ноль, вы должны вернуться с 404, потому что указанная запись не была найдена.

Однако в этом случае, если новая постоянная ссылка при каждом обновлении имеет смысл для вашего приложения, при успешном переключении вы можете отправить обратно обновленную постоянную ссылку и использовать ее для последующих запросов.

(В идеале это должен был быть комментарий к ответу Nowk, но я не смог найти поле для комментариев. Отсюда другой ответ)

0 голосов
/ 14 июня 2011
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
  Search Update (0.2ms)   UPDATE `searches` SET `locked` = 1, `updated_at` = '2011-06-13 23:19:39', `permalink` = '97894f26ba36761d04575260b132c230' WHERE `id` = 282

Вы отправили с идентификатором 9036304997196d83b20cba82a0cc67b8, но ваша модель сохраняет 97894f26ba36761d04575260b132c230

Почему ваш permalink обновляется другим значением? Ваш сеттер permalink восстанавливается по заданию?

Если это так, объясните, почему вы получаете nil на второй идентичный запрос id.

0 голосов
/ 14 июня 2011

Попробуйте изменить это:

if @search.update_attributes(params[:search])

на это:

if @search.save
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...