2009-06-08 16 views
0

J'ai une ligne dans mon routes.rb à la carte mon modèle de l'album comme une ressource:avec Redirige DataMapper & Rails

map.resources :albums 

Cependant, l'utilisation DataMapper en place de ActiveRecord Rails, pourquoi cette ligne:

format.html { redirect_to(@album) } 

provoquent une redirection vers:

albums/%23<Album:0x72d452c> 

au lieu de:

albums/1 

Dans le cas où un contexte plus est nécessaire, toute ma méthode de création du contrôleur est répertorié ici:

def create 
    @album = Album.new(params[:album]) 

    respond_to do |format| 
     if @album.save 
     flash[:notice] = 'Album was successfully created.' 
     format.html { redirect_to(@album) } 
     format.xml { render :xml => @album, :status => :created, :location => @album } 
     else 
     format.html { render :action => "new" } 
     format.xml { render :xml => @album.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 

Comme convention, cette méthode est appelée à la suite d'une soumission de formulaire de ma « nouvelle «méthode dans la new.html.erb: méthode

<h1>New album</h1> 

<% form_for(@album) do |f| %> 

    <p> 
    <%= f.label :name %><br /> 
    <%= f.text_field :name %> 
    </p> 
    <p> 
    <%= f.label :description %><br /> 
    <%= f.text_field :description %> 
    </p> 
    <p> 
    <%= f.label :genre %><br /> 
    <%= f.text_field :genre %> 
    </p> 
    <p> 
    <%= f.label :country %><br /> 
    <%= f.text_field :country %> 
    </p> 
    <p> 
    <%= f.submit 'Create' %> 
    </p> 
<% end %> 

<%= link_to 'Back', albums_path %> 

Répondre

3

Est-ce que DataMapper supporte un to_param ou avez-vous mis en œuvre un modèle de votre album? Jusqu'à ce que nous ayons Rails 3 et une couche "ActiveORM" pour couvrir les différences entre les ORM, vous devez vous assurer que votre code est conforme à une API de type AR.

Si est une méthode to_param et cela ne fonctionne toujours pas, essayez de le faire à l'ancienne:

format.html { redirect_to(album_path(@album.id)) } 

clunkier mais très probablement efficace.

+0

Wow. Ça a marché. Mais pourquoi cela a-t-il fonctionné? Dans mon exemple, qu'est ce que le "% 23 "? N'est-ce pas une sorte de représentation brute de l'objet Album? Donc, en créant la méthode to_param, comment cela assure-t-il que l'id de l'objet est représenté à la place de la représentation de l'objet? Est-ce parce qu'il existe une méthode par défaut to_param qui représente l'objet comme ce code: "% 23 "? Incroyable. J'aimerais savoir comment vous avez compris cela. Vous devez vraiment bien comprendre les entrailles de Rails. – Baker

+1

Les entrailles doivent faire un respond_to? Vérifiez avant d'appeler to_param, car les méthodes d'itinéraire acceptent également les entiers, les tableaux et les hachages. % 23 est un encodage URL de # , qui est plus ou moins comment Ruby expose des objets via la méthode inspect, sauf si ces objets, comme ActiveRecord, ont surchargé cette méthode. Puisque votre modèle DM n'est pas un AR ou un tableau ou un hachage, vous appelez simplement to_s sur l'objet, probablement dans le cadre d'une interpolation de chaîne. J'ai eu l'occasion de bousiller l'objet que j'envoyais à une méthode de route, donc j'ai déjà vu ce problème. – austinfromboston

+0

Merci d'avoir expliqué. – Baker