Rails中的相关模型?

时间:2010-06-07 09:27:12

标签: ruby-on-rails hyperlink associations models

在我的rails应用程序中,我有两个名为Kases和Notes的模型。它们的工作方式与博客帖子的评论方式相同,即。每个Kase条目都可以附加多个注释。

我已经完成了所有工作,但由于某种原因,我无法使用destroy链接为Notes工作。我认为我忽略了与标准模型的相关模型不同的东西。

Notes控制器

class NotesController < ApplicationController  
  # POST /notes
  # POST /notes.xml
  def create
    @kase = Kase.find(params[:kase_id])
    @note = @kase.notes.create!(params[:note])
    respond_to do |format|
      format.html { redirect_to @kase }
      format.js
    end
  end

end

Kase模型

class Kase < ActiveRecord::Base
  validates_presence_of :jobno
  has_many :notes

注意模型

class Note < ActiveRecord::Base
  belongs_to :kase
end

在Kase show视图中,我调用了/ notes中的部分名为_notes.html.erb:

Kase Show View

<div id="notes">    

        <h2>Notes</h2>
            <%= render :partial => @kase.notes %>
            <% form_for [@kase, Note.new] do |f| %>
                <p>
                    <h3>Add a new note</h3>
                    <%= f.text_field :body %><%= f.submit "Add Note" %>
                </p>
            <% end %>
    </div>

/notes/_note.html.erb

<% div_for note do %>
<div id="sub-notes">
  <p>
  <%= h(note.body) %><br />
  <span style="font-size:smaller">Created <%= time_ago_in_words(note.created_at) %> ago on <%= note.created_at %></span>
  </p>

<%= link_to "Remove Note", kase_path(@kase), :confirm => 'Are you sure?', :method => :delete, :class => 'important' %>

</div>
<% end %>

正如你所看到的,我有一个Remove Note destroy链接,但这会破坏与音符相关联的整个Kase。如何使销毁链接仅删除注释?

<%= link_to "Remove Note", kase_path(@kase), :confirm => 'Are you sure?', :method => :delete, :class => 'important' %>

任何帮助都将一如既往地受到高度赞赏!

谢谢,

丹尼

2 个答案:

答案 0 :(得分:1)

<%= link_to "Remove Note", note_path(note), :confirm => 'Are you sure?', :method => :delete, :class => 'important' %>

您还需要config / routes.rb中的以下条目(检查它是否已存在)

map.resources :notes

并检查NotesController中的以下方法

def destroy
  @note = Note.find(params[:id])
  @note.destroy
  .... # some other code here
end 
如果你没有NotesController并且不想拥有它,还有另一种方法可以做到这一点

答案 1 :(得分:1)

你正在使用kase -t hat调用delete方法,这就是为什么它删除了一个kase。此链接中没有任何内容

<%= link_to "Remove Note", kase_path(@kase), :confirm => 'Are you sure?', :method => :delete, :class => 'important' %>

除了提到笔记的文字外 - 为什么要删除笔记呢?尝试

<%= link_to "Remove Note", note_path(note), :confirm => 'Are you sure?', :method => :delete, :class => 'important' %>

这假设您已设置标准的restful路由和操作。

另外,您不应该将link_to用于非获取操作,因为

  1. google蜘蛛之类的 点击它们。你可能会说'他们 不能因为你需要被记录 在'那是真的,但它仍然存在 不是个好主意。
  2. 如果有人试图 在新标签/窗口中打开链接 它会打破你的网站,或去 错误的页面,因为它会尝试 打开那个网址,但改为获取 删除。
  3. 一般来说,在网上 设计,链接应该带你 某处和按钮应该“做” 东西',即做出改变。一个 像这样的破坏性行为 因此属于一个按钮而不是一个 链接。
  4. 使用button_to代替构建表单来执行相同的操作 http://railsbrain.com/api/rails-2.3.2/doc/index.html?a=M002420&name=button_to