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 %>

关于为什么破坏不起作用的任何想法?谢谢!

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操作中,您尝试查找 off 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 回答