0

chords/:id/show ページにフォームがあります (以下を参照)。:note_id をフォームに入力すると、:params の :chord_id とフォームの :note_id を使用して ChordNote が作成されます。これはうまくいきます。ただし、同じフォームを使用して ChordNote を削除しようとすると、次のようなエラーが表示されます。

ChordNotesController#destroy の NoMethodError、nil:nilClass の未定義メソッド '[]'

和音と音符を多対多の関係で結合する「ChordNote」のコントローラーです。

def create
    @chord = Chord.find(params[:chordnote][:chord_id])
    @note = Note.find(params[:chordnote][:note_id])

    if @chord.hasnote?(@note)
        # Add error message here, have it not redirect
        redirect_to @chord
    else
        @chord.addnote!(@note)
        redirect_to @chord
    end
end

def destroy
    @chord = Chord.find(params[:chordnote][:chord_id])
    @note = Note.find(params[:chordnote][:note_id])
        Chordnote.find_by(note_id: @note.id, chord_id: @chord.id).destroy
    redirect_to chord_path(@chord)
end

これはフォームです (chords/:id/show に表示されます):

    <%= form_for(@chord.chordnotes.build(chord_id: @chord.id)) do |f| %>
          <div><%= f.hidden_field :chord_id, value: @chord.id %></div>
          <div class="field">
            <%= f.text_field :note_id, placeholder: "Enter the note's id" %>
          </div>
          <%= f.submit "Add Note", class: "btn btn-large" %>
          <%= link_to "Remove Note", Chordnote.find_by(note_id: 1), method: :delete, title: "test title", class: "btn btn-large" %>
    <% end %>

なぜdestroyが機能しないのかについて何か考えはありますか? ありがとう!

nil:NilClass の未定義メソッド `[]'

def destroy
    ####The error is on the following line####
    @chord = Chord.find(params[:chordnote][:chord_id])

    @note = Note.find(params[:chordnote][:note_id])

    Chordnote.find_by(note_id: @note.id, chord_id: @chord.id).destroy

    redirect_to chord_path(@chord)

Rails.root: /Users/mydocs/myprojects/rails_projects/what_key_v002

Application Trace | Framework Trace | Full Trace
app/controllers/chordnotes_controller.rb:23:in `destroy'
Request

投稿されたパラメーター:

{"_method"=>"delete",
 "id"=>"10"}
4

2 に答える 2

1
Chordnote.find_by(note_id: @note.id, chord_id: @chord.id)

レコードが見つからないため、その nil と nil には destroy というメソッドがありません。アクションに正しいパラメータを渡していますか?

アップデート:

params[:chordnote] #seems to be nil, so 
params[:chordnote][:note_id] => exception

アクションにポストされたパラメータを確認してください。コンソール ログで確認できます。

アップデート:

リンクは次のようになります。

<%= link_to "Remove Note", chord_notes_path(note_id: 1, chord_id: @chord.id), method: :delete, title: "test title", class: "btn btn-large" %>

そしてあなたの削除アクションで

@chord = Chord.find(params[:chord_id])
@note = Note.find(params[:note_id])
于 2013-09-11T19:06:12.427 に答える
1

あなたのdestroyアクションでは、ルックアップをオフにしようとしていますparams[:chordnote][:note_id]が、使用可能なパラメーターは のみです{"_method"=>"delete", "id"=>"10"}。ヘルパーに と の両方note_idchord_id引数として追加する必要があります。link_to

<%= link_to "Remove Note", chordnote_path(:chord_id => @chord.id, :note_id => 1), :method => :delete %>
# => <a href="/chordnote?chord_id=your_chord_id&amp;note_id=1">Remove Note</a>

次に、destroyアクションで、ルックアップをオフparams[:chord_id]にし、次のようにしparams[:note_id]ます。

def destroy
    Chordnote.find_by(note_id: params[:note_id], chord_id: params[:chord_id]).destroy
    redirect_to chord_path(params[:chord_id])
end
于 2013-09-11T19:43:22.963 に答える