我在和弦/:id / show页面上有一个表单(如下所示)。我可以在表单中输入:note_id,然后使用:chord_id from:params和from :: form_id创建一个ChordNote。这很好用。但是,当我尝试使用相同的表单删除ChordNote时,我收到一条错误消息:
ChordNotesController中的NoMethodError#destroy,未定义的方法'[]'为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
这是表格(出现在和弦/: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"}
答案 0 :(得分: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])
答案 1 :(得分:1)
在destroy
操作中,您尝试关闭params[:chordnote][:note_id]
,但唯一可用的参数是{"_method"=>"delete", "id"=>"10"}
。您需要在note_id
帮助程序中添加chord_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&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