2010-07-18 7 views
0

J'ai les données suivantes. Chaque article a un titre et un corps et aussi jusqu'à trois URL. Je voudrais stocker les URL dans une table différente. Donc dans ma forme, j'ai un champ pour les urls. Cependant, ils ne fonctionnent pas, seuls les champs article sont entrés dans la base de données. comment devrais-je les spécifier? Est-ce que n'importe quelle âme aimable m'aiderait avec ceci?Sinatra et Datamapper - insertion de données dans une table de relation un à plusieurs

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> 

Répondre

1

Je crois que

, through => Resource 

est nécessaire que si vous faites un grand nombre à plusieurs. Un one-to-many, ce que je pense est ce que vous voulez, ne l'exige pas. Découvrez la relation de publication et de commentaire affichée au the associations page.

EDIT pour commentaires:

Si je vous, je nommerais mes champs de formulaire normalement et construire manuellement l'objet de base de données, par exemple:

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

puis:

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 
+0

qu'en est-il du formulaire? ne fonctionne pas, l'entrée n'est pas enregistrée dans la base de données. –

+0

Dans l'exemple ci-dessus, il a juste "url" comme champ dans le formulaire html. Si vous montrez les trois, alors vous devrez mettre à jour le constructeur url.new avec les trois du formulaire html. –

Questions connexes