0

Ruby 1.9.2p290

Rails 3.1.0

私は足場からサイトを構築し、ルートを変更しようとしているので、:idを使用する代わりに:gameNumberを使用できます。

私のコントローラーで私は変更しました

から

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

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

私の見解では私は変わった

から

ticket

ticket_path(ticket.gameNumber)

私が抱えている問題は、更新しようとすると、nilエラーが発生することです。問題は、更新ボタンが:gameNumberではなく:idを使用しているためだとわかっていますが、修正方法がわかりません。問題に関連するコードは次のとおりです。

コントローラ

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#updateのNoMethodError

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 / worksheet / App

アプリケーショントレース

app / controllers / ticket_controller.rb:65:block in update' app/controllers/tickets_controller.rb:64:in更新中 '

リクエスト

パラメーター:

{"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

次のエラーが発生します。

Tickets#editのNoMethodError

行#1が発生したC:/home/workspace/App/app/views/tickets/_form.html.erbを表示しています。

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 / worksheet / 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使用するように呼び出しを変更する必要があるのと同じように、呼び出しを変更する必要があります。デフォルトでは、既存のレコードに対してが呼び出されると、投稿先のURLはになります。オプションを渡すことでそれをオーバーライドできます。gameNumberidform_forform_forticket_path(ticket):url

このすべての代わりに、あなたはすることを検討したいかもしれません

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

これは、のすべての呼び出しに移動して変更することなく、URLで作成ticket_path(ticket)またはform_for(ticket)使用する必要があります。gameNumberticket_path

于 2011-12-30T01:30:39.237 に答える