为什么变量传递创建,而不是销毁?

时间:2013-09-11 19:00:29

标签: ruby-on-rails forms ruby-on-rails-4

我在和弦/: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"}

2 个答案:

答案 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_idlink_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