Что не так с этой формой маршрутизации? - PullRequest
0 голосов
/ 06 апреля 2011

У меня есть модель пользователя и модель книги.Пользователи могут читать книги (как читатели), которые создают запись в модели «Чтения»:

id | reader_id | book_id

У пользователей также есть список книг, которые они прочитали.Они хранятся в красном (я использую красный, потому что настоящее и прошедшее время слова «чтение» совпадают), которая выглядит так же, как и модель «Рединг» выше.

Теперь, когда пользователь читаеткнигу, я хотел бы отобразить кнопку, которая представляет окончание книги.

Действие завершения находится в ReadingsController и выглядит следующим образом:

def finish
  @book = current_user.readings.find(params[:id]).book
  current_user.stop_reading!(@book)
  current_user.make_red! @book

  redirect_to :back
end

Как вы, вероятно, можете сказать, это занимаетв id записи в таблице чтений уничтожает ее и создает новую запись в таблице для записи книг красным цветом.

Помощник по форме для кнопки «Завершить чтение» в настоящее время выглядит следующим образом:

<%= form_for :reading, current_user.readings.find_by_book_id(book.id), :url => { :controller => :readings, :action => "finish" }, :method => :delete do |f| %>
  <div class="actions"><%= f.submit button_text %></div>
<% end %>

Но по какой-то причине это создает форму с неправильным идентификатором, потому что "9781440506604" - это не идентификатор записи в таблице чтений, это идентификатор записи в таблице книг (ISBN-13книга, если быть точным).

<form accept-charset="UTF-8" action="/readings/9781440506604/finish" method="post">
</form>

Что я делаю не так?

РЕДАКТИРОВАТЬ , чтобы добавить read.rb

class Reading < ActiveRecord::Base
  attr_accessible :book_id

  # one person reading a new book may cause feed_item creations in multiple users feeds
  has_many :feed_items, :as => :event
  has_many :comments, :as => :parent, :dependent => :destroy

  scope :from_users_followed_by, lambda { |user| followed_by(user) }

  # need to pass the class name here because there is no Reader model
  belongs_to :reader, :class_name => "User"
  belongs_to :book

  validates :reader_id, :presence => true
  validates :book_id, :presence => true

  def self.followed_by(user)
    ...
  end
end

# and user.rb
class User < ActiveRecord::Base
attr_accessible :name, :email, :password, :password_confirmation, :avatar, :remember_me, :avatar_url
has_many :readings, :dependent => :destroy,
                      :foreign_key => "reader_id"
  has_many :reads, :through => :readings, :source => :book
  has_many :reds, :foreign_key => "reader_id",
                  :dependent => :destroy
  has_many :red, :through => :reds, :source => :book

  def reading? book
    self.readings.find_by_book_id(book)
  end

  def read! book
    self.readings.create!(:book_id => book.id)
  end

  def stop_reading! book
    self.readings.find_by_book_id(book).destroy
  end

  def red? book
    self.reds.find_by_book_id(book)
  end

  def make_red! book
    unless red? book
      self.reds.create!(:book_id => book.id)
    end
  end
end

Кстати, я попытался сделатьo читает книгу 1 и выполняет user.readings.find_by_book_id (1) в консоли и возвращает запись из таблицы чтений.

по запросу

# routes.rb
resources :readings, :only => [:create, :destroy, :show] do
  member do
    post :create_comment
    delete :finish
  end
end

Ответы [ 2 ]

1 голос
/ 06 апреля 2011

Похоже, у вас есть to_param метод в вашей Reading модели

. Попытайтесь четко назвать id:

current_user.readings.find_by_book_id(book.id).id

UPD

  1. удалить :only => [:create, :destroy, :show] из ваших маршрутов
  2. использовать это <%= form_for :reading, current_user.readings.find_by_book_id(book.id), :url => { :controller => :readings, :action => "finish", :id => current_user.readings.find_by_book_id(book.id).id }, :html => {:method => :delete} do |f| %>
0 голосов
/ 06 апреля 2011

Я не особо разбираюсь в рельсах 3 (все еще использую рельсы 2), но разве вы не должны передавать больше информации параметру :url?

Похоже, это ничего не говорит об идентификаторе, который вы хотите опубликовать:

:url => { :controller => :readings, :action => "finish" }

Разве это не должно быть ближе к этому:

:url => { :controller => :readings, :action => "finish", :id => reading_id }

(Предполагается, что вместо действительного идентификатора будет подставляться reading_id)

...