Rails 5删除按钮在嵌套路由中查找显示方法

时间:2018-06-18 06:51:19

标签: ruby-on-rails ruby-on-rails-5

我不确定我做了什么因为它工作而且像个白痴一样,我没有在我的应用程序的下一部分工作之前完成工作。我有一个带有嵌套contact模型的note模型。我可以创建一个新的联系人,我可以创建一个嵌套在联系人中的注释,但如果我尝试删除一个注释,我会得到The action 'show' could not be found for Accounts::NotesController错误页面,如果我尝试删除一个联系人,它会使用show方法和不是毁灭。

的routes.rb

Rails.application.routes.draw do
  devise_for :users
  constraints(SubdomainRequired) do
    scope module: 'accounts' do
      ...
      resources :contacts do
        resources :notes
      end
    end
  end

  ...
end

的application.js

//= require rails-ujs
//= require activestorage
//= require turbolinks
//= require_tree .

import Vue from 'vue/dist/vue.esm'
import App from 'components/app.vue'

document.addEventListener('DOMContentLoaded', () => {
    document.body.appendChild(document.createElement('app'));
    const app = new Vue({
        el: 'app',
        template: '<App/>',
        components: { App }
    });

    console.log(app)
});

contacts_controller.rb

...
    def destroy
      @contact = Contact.find(params[:id])
      @contact.destroy
      respond_to do |format|
        format.html {redirect_to contacts_url, notice: 'Contact was successfully destroyed.'}
        format.json {head :no_content}
      end
    end
...

notes_controller.rb

module Accounts
  class NotesController < Accounts::BaseController

    def create
      @contact = Contact.find(params[:contact_id])
      @note = @contact.notes.create(params[:note].permit(:id, :body))
      redirect_to edit_contact_path(@contact)
    end

    def destroy
      @contact = Contact.find(params[:contact_id])
      @note = @contact.notes.find(params[:id])
      @note.destroy
      redirect_to edit_contact_path(@contact)
    end
  end
end

泛音/ _head.html.erb

<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.1/css/bulma.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/css/select2.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/js/select2.min.js"></script>
<script defer src="https://use.fontawesome.com/releases/v5.0.7/js/all.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
<%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
<%= csrf_meta_tags %>
<%= csp_meta_tag %>

联系人/ index.html.erb

<table class="table is-bordered is-striped is-narrow is-hoverable is-fullwidth">
  ...

  <tbody>
    <% @contacts.each do |contact| %>
      <tr>
        ...
        <td><%= link_to 'Destroy', contact, method: :delete, remote: true, data: { confirm: 'Are you sure?' } %></td>
      </tr>
    <% end %>
  </tbody>
</table>
...

联系人/ edit.html.erb

<section>
  <%= render 'form', contact: @contact %>
  <%= render @contact.notes %>
  <div class="notes-form">
    <%= render 'accounts/notes/form' %>
  </div>
</section>

备注/ _form.html.erb

<%= form_for([@contact, @contact.notes.build]) do |f| %>
  <div class="field">
    <div class="control">
      <%= f.text_area :body, wrapper: false, placeholder: 'Add A New Note...' %>
    </div>
  </div>
  <div class="field">
    <div class="control">
      <%= f.button :submit, remote: true, class: 'button is-primary' %>
    </div>
  </div>
<% end %>

备注/ _note.html.erb

<div class="box">
  <article class="media">
    <div class="media-content">
      <div class="content">
        <p>
          <%= time_ago_in_words(note.created_at) %> ago <%= note.body %>
        </p>
      </div>
    </div>
     <%= link_to 'Delete', [note.contact, note],
                  method: :delete, class: 'button is-danger', remote: true, data: { confirm: 'Are you sure?' } %>
  </article>

</div>

0 个答案:

没有答案