Конфликт ассоциаций пони и Сиквела?

#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?