Sinatra и Datamapper - вставка данных в таблицу отношений один ко многим - PullRequest
0 голосов
/ 18 июля 2010

У меня есть следующее. Каждая статья имеет заголовок и текст, а также до трех URL. Я хотел бы сохранить URL-адреса в другой таблице. Поэтому в моей форме у меня есть поле для URL. Однако они не работают, только поля статьи вводятся в базу данных. как мне их указать? Может ли какая-нибудь добрая душа помочь мне с этим?

class Article
  include DataMapper::Resource

  property :id,     Serial
  property :title,  String
  property :body,   Text

  has n, :urls, through => Resource
end

class Url
  include DataMapper::Resource

  property :id,     Serial
  property :url_01,    String
  property :url_02,    String
  property :url_03,    String

  belongs_to :article
end

post '/create' do
  @article = Article.new(params[:article])
  if @article.save
    redirect "/articles"
  else
    redirect "/articles/new"
  end
end

--------------------------------------
<form action="/create" method="post">
  <p>
    <label>Article Title</label>
    <input type="text" name="article[title]">
  </p>
  <p>
    <label>Article Body</label>
    <input type="text" name="article[body]">
  </p>
  <p>
    <label>Url</label>
    <input type="text" name="article[url_01]">
  </p>

  <p>
    <input type="submit">
  </p>

1 Ответ

1 голос
/ 18 июля 2010

Я считаю, что

, through => Resource

требуется только в том случае, если вы поддерживаете отношения многие ко многим.Один-ко-многим, что, я думаю, то, что вы хотите, не требует этого.Проверьте связь между сообщениями и комментариями, показанную на странице ассоциаций .

РЕДАКТИРОВАТЬ для комментария:

Если бы я был вами, я бы назвал свои поля формы как обычно и создал быобъект базы данных вручную, например:

<form action="/create" method="post">
  <p>
    <label>Article Title</label>
    <input type="text" name="title">
  </p>
  <p>
    <label>Article Body</label>
    <input type="text" name="body">
  </p>
  <p>
    <label>Url</label>
    <input type="text" name="url">
  </p>

  <p>
    <input type="submit">
  </p>

, а затем:

post '/create' do
  @article = Article.new(
      :title      => params[:title],
      :body       => params[:body]
  )
  @url = url.new(
      url_01 => params[:url]
  )
  @article.url = @url

  if @article.save
    redirect "/articles"
  else
    redirect "/articles/new"
  end
end
...