#ruby #sinatra #sequel #pony
#ruby #синатра #продолжение #pony
Вопрос:
Я столкнулся с проблемой при использовании Pony и Sequel в приложении Sinatra. Без Пони все идет просто отлично, но просто ассоциации с продолжением Пони нарушаются. Вот мои модели для блога:
class Post < Sequel::Model
one_to_many :comments, :order => :date.asc(), :conditions => {:approved => 1}
set_schema do
primary_key :id
varchar :title
varchar :text
varchar :category
varchar :status
datetime :date
varchar :link
end
end
class Comment < Sequel::Model
plugin :validation_helpers
many_to_one :posts
attr_accessor :ip, :user_agent, :referrer, :permalink
set_schema do
primary_key :id
integer :post_id
varchar :author
varchar :comment
DateTime :date
varchar :email
varchar :url
varchar :approved
end
Затем я вызываю их следующим образом в маршруте
post '/:link' do
@post = Post[:link=>params[:link]]
params[:comment].merge!( {
:ip => request.ip.to_s,
:user_agent => request.env['HTTP_USER_AGENT'].to_s,
:referrer => request.env['REFERER'].to_s,
:permalink => request.env['REFERER'].to_s
} )
begin
@comment = Comment.create params[:comment]
@post.add_comment @comment
rescue
@message = $!
end
@title = @post.title
haml :posts
end
Мне даже не нужно куда-то звонить пони, просто требовать этого @post.add_comment @comment
не удается. В нем говорится
NoMethodError - undefined method `_add_comments' for #<Post:0x102b09890>:
/Library/Ruby/Gems/1.8/gems/sequel-3.21.0/lib/sequel/model/associations.rb:1078:in `send'
/Library/Ruby/Gems/1.8/gems/sequel-3.21.0/lib/sequel/model/associations.rb:1078:in `add_associated_object'
/Library/Ruby/Gems/1.8/gems/sequel-3.21.0/lib/sequel/model/associations.rb:743:in `add_comment'
Мне кажется, что это конфликт с send? Я даже не знаю, как начать это отлаживать.
Ответ №1:
Это вызвано проблемой ActiveSupport, хотите верьте, хотите нет. Вам следует перейти к ActiveSupport 3.0.3 или вручную запросить перегибы ActiveSupport по умолчанию через:
require 'active_support/inflections'
В принципе, после версии 3.0.3 ActiveSupport сделал возможным загрузку inflector без перегибов по умолчанию, что приводит к сбоям в методах singularize и pluralize. Mail gem, который, как я предполагаю, использует pony, является одной из библиотек, которая, как известно, была повреждена этим изменением.
Разработчики Rails, по-видимому, считают это ошибкой не в ActiveSupport, а в библиотеках, которые используют ActiveSupport.
Комментарии:
1. Я могу ошибаться (к сожалению, я новичок в ruby), но я не использую rails или активную поддержку, а sinatra и sequel. И требование перегибов sequel не устраняет это.
2. Вы хотя бы потрудились попробовать совет, который я дал? pony зависит от почты, которая до версии 2.3.0 (выпущенной вчера) зависела от active_support. Вы могли бы попробовать обновить mail gem до версии 2.3.0 и посмотреть, исправит ли это ситуацию.
3. @keepitterron Я могу подтвердить, что то, что говорит Джереми Эванс, верно. Ввод
require 'active_support/inflections'
устраняет эту проблему, и Pony действительно требует Mail, для которого требуется ActiveSupport (и i18n, и mine-types, для которых требуются mocha и sqlite3-ruby и test_declarative, а также treetop и, следовательно, polyglot). Список драгоценных камней, отправленных по почте через Pony, довольно нелеп.4. Отличные новости о том, что mail прекратила активную поддержку; спасибо за уведомление! Было бы неплохо удалить этот полууродливый взлом.
5. конечно, я пробовал, но это не сработало. Я думаю, что, возможно, я что-то еще напортачил. Есть ли разница в размещении require до или после другого require?