2010-06-07 4 views
0

В моем приложении rails у меня есть две модели, называемые Kases и Notes. Они работают так же, как и комментарии к сообщениям в блоге, I.e. каждая запись Kase может содержать несколько заметок.Связанные модели в Rails?

У меня все работает, но по какой-то причине я не могу получить ссылку на уничтожение для заметок. Я думаю, что я пропускаю то, что отличается от связанных моделей с стандартными моделями.

Примечания Контроллер

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 

Касе Модель

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

Примечание Модель

class Note < ActiveRecord::Base 
    belongs_to :kase 
end 

В Kas е показать вид я называю частично внутри/нот называется _notes.html.erb:

Касе 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. Как сделать ссылку destroy удалить только заметку?

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

Любая помощь, как всегда, будет принята с благодарностью!

Спасибо,

Дэнни

ответ

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

Вам также потребуется следующая запись в конфигурационном/routes.rb (проверьте, если он уже существует)

map.resources :notes 

и проверьте следующий метод в вашем NotesController

def destroy 
    @note = Note.find(params[:id]) 
    @note.destroy 
    .... # some other code here 
end 

есть и другой способ сделать это, если у вас нет NotesController и вы не хотите его получать.

+0

Отлично, это был map.resources, который мне не хватало. Woops! Спасибо! – dannymcc

1

Вы вызываете метод удаления в шляпе kase -t, почему он удаляет 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' %> 

Предполагается, что у вас есть стандартные успокаивающие маршруты и действия.

В качестве дополнительной точки, вы никогда не должны использовать link_to для не-получить действия, потому что

  1. Google пауков и тому подобное будет нажмите на них. Вы могли бы сказать: «Они не могут, потому что вам нужно войти в систему », и это правда, но это все еще не очень хорошая идея.
  2. если кто-то пытается открыть ссылку в новой вкладке/окне это нарушит ваш сайт, или перейдите на ту страницу, так как он будет пытаться открыть этот URL, но с получите вместо из функции удаления ,
  3. в целом, в Интернете дизайн, ссылки должны взять вас где-нибудь и кнопки должны «сделать », т.е. внести изменения. A деструктивное действие, подобное этому поэтому принадлежит на кнопке не .

Используйте вместо кнопки button_to, которая создает форму для выполнения той же самой вещи.
http://railsbrain.com/api/rails-2.3.2/doc/index.html?a=M002420&name=button_to

+0

link_to with: method =>: delete OR: confirm set также создает тег

, поэтому безопасно использовать –

+0

Я не знал о опции button_to, если быть честным! Спасибо за ответ, я знаю, что не упоминал ссылку в ссылке, размещенной здесь. Я пробовал несколько разных вариантов, и это было то, что делало * что-то *, даже если это не было желаемое действие. Еще раз спасибо! – dannymcc

Смежные вопросы