0

2 つの DataMapper モデルがあります。

class Address
  include DataMapper::Resource

  property :id, Serial
  property :url, String, :required => true

  has n, :logs
end

class Log
  include DataMapper::Resource

  property :id, Serial
  property :useragent, String

  belongs_to :address
end

Sinatra を使用して新しいアドレスを作成し、別の方法でこれらのアドレスに属するログを記録します。

  # page after posting a form
  post '/' do
    @messages = []

    if (params[:url] =~ URI::regexp).nil?
      @messages.push('URL is not valid!')
    else
      address = Address.create(:url => params[:url])

      base36 = address.id.to_s(36)
      @messages.push(request.url + base36)
    end

    erb :index
  end

  # redirection from a short url
  get '/:base36' do |base36| 
    # probably not necessary...
    if base36 =~ /[[:alnum:]]+/
      begin
        id = base36.to_i(36)
        address = Address.get(id)

        log = Log.create(:useragent => request.user_agent)
        address.logs << log
        # log.save
        address.save
        # address.logs.save

        address.logs.length.to_s
        # redirect address.url
      rescue
        redirect '/'
      end
    else
      redirect '/'
    end
  end

問題は、新しいログがデータベースに保存されていないことです。ページをリロードするたびに表示されます (インクリメントする必要があります) address.logs.length.to_s1これを行うと(別の方法で):

logs = Address.get(id).logs
@views = logs.length

viewsは常に0。このコードの何が問題になっていますか?


わかりましたので、ユーザーエージェントが長すぎる文字列フィールドにプッシュしようとしました。文字列は 50 文字に制限されています。#datamapper irc チャンネルの人々が私を助けてくれました.save。この場合、メソッドは false を返し、データは保存されません。

4

2 に答える 2

1

OK、それで私は文字列フィールドに長すぎるユーザーエージェントをプッシュしようとしました。文字列は50文字に制限されています。#datamapper ircチャネルの人々が私を助けてくれました。この場合、.saveメソッドはfalseを返し、データは保存されません。

于 2012-11-13T14:08:48.877 に答える
0

コメントは次のように述べています。

address.logs << log
# log.save

しかし、コードはそうは言っていません。渡されたアドレスでログを作成する必要があります

log = Log.create(:useragent => request.user_agent, :address => address)

ログセットにプッシュした後、ログを保存します。

log = Log.new(:useragent => request.user_agent)
address.logs << log
log.save # not a comment, just a self-explaining code

あなたの場合の関係はLogリソースに保存されるので、Address.

于 2012-10-28T13:12:53.583 に答える