我创建了一个轻量级CRM,用户可以在其中保存联系人并在其上留下注释。我希望用户能够编辑他们的评论。
好的,到目前为止我已经完成了:
我的控制器:
def edit
@contact = Contact.find(params[:contact_id])
@note = @contact.notes.find(params[:id])
end
def update
@contact = Contact.find(params[:contact_id])
@note = @contact.notes.find(params[:id])
if @note.update(notes_params)
redirect_to contact_path(@contact)
else
render 'edit'
end
end
我的路线:
resources :contacts do
resources :notes
end
My Rake Routes:
new_contact_note GET /contacts/:contact_id/notes/new(.:format) notes#new
edit_contact_note GET /contacts/:contact_id/notes/:id/edit(.:format) notes#edit
contact_note GET /contacts/:contact_id/notes/:id(.:format) notes#show
查看文件链接:(我认为这是问题的罪魁祸首)
<p>
<%= link_to 'Edit Note', edit_contact_note_path(@contact, @note) %>
</p>
然后,当我尝试编辑笔记时,我收到此错误:
No route matches {:action=>"edit", :contact_id=>"1", :controller=>"notes", :id=>nil}, missing required keys: [:id]
(如果您需要任何其他信息,请告诉我,我会给他们)
这是代码
首先从_form.html.erb文件中呈现表单注释。
<%= form_with(model: [ @contact, @contact.notes.build],
local: true) do |form| %>
<p>
<%= form.label :title %><br>
<%= form.text_field :title %>
</p>
<p>
<%= form.label :body %><br>
<%= form.text_area :body %>
</p>
<p>
<%= form.submit %>
</p>
<% end %>
这是_note.html.erb视图,它呈现了笔记的编辑链接:
<p>
<strong>Note Title:</strong>
<%= note.title %>
</p>
<p>
<strong>Note Body:</strong>
<%= note.body %>
</p>
<p>
<%= link_to 'Delete Note', [note.contact, note],
method: :delete,
data: { confirm: 'Are you sure about the Note going away?' } %>
<p>
<%= link_to 'Edit Note', edit_contact_note_path(@contact, @note) %>
</p>
然后这里是notes_controller.rb的所有控制器代码
class NotesController < ApplicationController
def create
@contact = Contact.find(params[:contact_id])
@note = @contact.notes.create(note_params)
redirect_to contact_path(@contact)
end
def destroy
@contact = Contact.find(params[:contact_id])
@note = @contact.notes.find(params[:id])
@note.destroy
redirect_to contact_path(@contact)
end
def edit
@contact = Contact.find(params[:contact_id])
@note = @contact.notes.find(params[:id])
end
def update
@contact = Contact.find(params[:contact_id])
@note = @contact.notes.find(params[:id])
if @note.update(notes_params)
redirect_to contact_path(@contact)
else
render 'edit'
end
end
private
def note_params
params.require(:note).permit(:title, :body)
end
end
以下是联系人部分的show.html.erb代码。我的错误所在的地方来自:
<p>
<strong>First Name:</strong>
<%= @contact.first_name %>
</p>
<p>
<strong>Last Name:</strong>
<%= @contact.last_name %>
</p>
<hr>
<h2>Notes:</h2>
<%= render @contact.notes %>
<hr>
<h2>Add a Note:</h2>
<%= render 'notes/form' %>
<br>
<hr>
<%= link_to 'Back', contacts_path %>
<%= link_to 'Edit', edit_contact_path(@contact) %>