0

红宝石 1.9.2p290

导轨 3.1.0

我从脚手架构建了我的网站,并试图改变我的路线,所以,我可以使用:gameNumber,而不是使用:id。

在我的控制器中我改变了

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

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

在我看来我改变了

ticket

ticket_path(ticket.gameNumber)

我遇到的问题是当我尝试更新时,我得到一个 nil 错误。我知道问题是因为更新按钮使用的是: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| %>

如果有人可以向我指出一个可以解释问题、帮助解释问题、提供解决方案或更好的方法的链接,我将不胜感激。

谢谢。

更新:

这是错误:

TicketsController 中的 NoMethodError#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

应用程序跟踪

app/controllers/tickets_controller.rb:65:in 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"}

你也想要框架跟踪和完整跟踪吗?

更新 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"}
4

1 回答 1

2

就像您需要将呼叫更改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

这应该在 url 中创建ticket_path(ticket)form_for(ticket)使用gameNumber,而无需您更改每次调用ticket_path.

于 2011-12-30T01:30:39.237 回答