Проблема Ruby on Rails с update_attributes после изменения маршрута

Рубин 1.9.2p290

Рельсы 3.1.0

Я построил свой сайт из строительных лесов и пытаюсь изменить свои маршруты, поэтому вместо использования :id я могу использовать :gameNumber.

В моем контроллере я изменил

от

@ticket = Ticket.find(params[:id])

to

@ticket = Ticket.find_by_gameNumber(params[:id])

В моих взглядах я изменился

от

ticket

to

ticket_path(ticket.gameNumber)

У меня проблема в том, что когда я пытаюсь обновить, я получаю нулевую ошибку. Я знаю, что проблема в том, что кнопка обновления использует :id, а не :gameNumber, я просто не знаю, как это исправить. Вот соответствующий код, относящийся к проблеме.

Контроллер

def update
  @ticket = Ticket.find_by_gameNumber(params[:id])

  respond_to do |format|
    if @ticket.update_attributes(params[:ticket])
      format.html { redirect_to ticket_path(@ticket.gameNumber), notice: 'Ticket was successfully updated.' }
      format.json { head :ok }
    else
      format.html { render action: "edit" }
      format.json { render json: @ticket.errors, status: :unprocessable_entity }
    end
   end
end

Форма

<%= form_for(@ticket) do |f| %>

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

Спасибо.

Обновлять:

Вот ошибка:

NoMethodError в TicketsController#update

You have a nil object when you didn't expect it!
You might have expected an instance of ActiveRecord::Base.
The error occurred while evaluating nil.update_attributes

Rails.root: C:/home/workspace/App

Трассировка приложения

приложение/контроллеры/tickets_controller.rb:65:в block in update' app/controllers/tickets_controller.rb:64:inupdate'

Запрос

Параметры:

{"utf8"=>"✓",
 "_method"=>"put",
 "authenticity_token"=>"4ft2LU5CRcV+qV8ipjBm23TTBrXlmHjA042SpSZOkMc=",
 "ticket"=>{"gameNumber"=>"1114",
 "gameName"=>"Fun"
 "isClosing"=>"0",
 "isActive"=>"1"},
 "commit"=>"Update Ticket",
 "key"=>:gameNumber,
 "id"=>"220"}

Вам также нужны Framework Trace и Full Trace?

Обновление 2:

Если я добавлю в свою модель следующее:

def to_param
   gameNumber
end

Я получаю следующие ошибки.

NoMethodError в тикетах#edit

Показывает C:/home/workspace/App/app/views/tickets/_form.html.erb, где строка № 1 поднята:

undefined method `split' for 1114:Fixnum

Извлеченный источник (вокруг строки № 1):

1: <%= form_for(@ticket) do |f| %>
2:   <% if @ticket.errors.any? %>
3:     <div id="error_explanation">
4:       <h2><%= pluralize(@ticket.errors.count, "error") %> prohibited this ticket from being saved:</h2>

След включения шаблона: app/views/tickets/edit.html.erb

Rails.root: C:/home/workspace/App

Трассировка приложения:

app/views/tickets/_form.html.erb:1:in `_app_views_tickets__form_html_erb__464096833_36793764'
app/views/tickets/edit.html.erb:3:in `_app_views_tickets_edit_html_erb__750875298_37634784'

Запрос

Параметры:

{"key"=>:gameNumber,
 "id"=>"1114"}

person david    schedule 29.12.2011    source источник
comment
Пожалуйста, покажите нам, что это за нулевая ошибка, которую вы получаете.   -  person Ryan Bigg    schedule 30.12.2011
comment
Я обновил свой вопрос с помощью Application Trace. Дайте мне знать, будет ли полезен Framework Trace или Full Trace.   -  person david    schedule 30.12.2011


Ответы (1)


Как бы вам ни потребовалось изменить вызовы ticket_path, чтобы использовать gameNumber вместо id, вам потребуется изменить вызов form_for. По умолчанию, когда form_for вызывается для существующей записи, URL-адрес, на который она отправляется, будет ticket_path(ticket). Вы можете переопределить это, передав опцию :url.

Вместо всего этого вы можете подумать о том, чтобы сделать

class Ticket < ActievRecord::Base
  def to_param
    gameNumber.to_s
  end
end

Это должно заставить ticket_path(ticket) или form_for(ticket) использовать gameNumber в URL-адресе без необходимости идти и изменять каждый вызов ticket_path.

person Frederick Cheung    schedule 30.12.2011
comment
если gameNumber не является строкой, вам, вероятно, потребуется вызвать для нее to_s - person Frederick Cheung; 30.12.2011
comment
Ничего себе, я потратил около трех часов на поиски этого и пробовал все виды вещей до этого. Это работает, большое спасибо! - person david; 30.12.2011