Связанные модели в Rails? - PullRequest
0 голосов
/ 07 июня 2010

В моем приложении rails у меня есть две модели: Kases и Notes.Они работают так же, как комментарии к сообщениям в блоге, т. Е. К каждой записи Kase может быть прикреплено несколько заметок.

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

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

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 %>

Как вы видите, у меня есть заметка для удаления уничтожитьссылка, но это уничтожает весь Kase, с которым связана заметка.Как заставить ссылку уничтожить удалить только заметку?

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

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

Спасибо,

Дэнни

Ответы [ 2 ]

1 голос
/ 07 июня 2010

Вы вызываете метод удаления для 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. гугл пауки и т.п. нажмите на них. Вы могли бы сказать «они не может, потому что вам нужно войти в 'и это правда, но это все еще не хорошая идея.
  2. если кто-то попытается открыть ссылку в новой вкладке / окне это сломает ваш сайт, или перейдите на неправильная страница, так как она будет пытаться открыть этот URL, но вместо этого получить удаления.
  3. как правило, в сети дизайн, ссылки должны взять вас где-то и кнопки должны 'сделать вещи, то есть вносить изменения. разрушительное действие, как это следовательно, принадлежит кнопке, а не ссылка.

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

1 голос
/ 07 июня 2010
<%= link_to "Remove Note", note_path(note), :confirm => 'Are you sure?', :method => :delete, :class => 'important' %>

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

map.resources :notes

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

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

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

...