2009-06-08 3 views
0

私は資源としての私のアルバムのモデルをマッピングするために、私のroutes.rbをしてラインを持っているDataMapperの&レールとリダイレクト

format.html { redirect_to(@album) } 

原因リダイレクトへ:

albums/%23<Album:0x72d452c> 

の代わり:

さらにコンテキストが必要な場合は
albums/1 

、コントローラからの私の完全な作成方法は以下のとおりです:

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 

慣例であるため、この方法は、私の新しいからのフォーム送信の結果として呼び出されます「new.html.erbでの方法:

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

答えて

3

はDataMapperのto_paramメソッドをサポートしていますか、あなたのアルバムのモデルに1を実装していますか? ORMの違いをカバーするためにRails 3と "ActiveORM"レイヤーを用意するまでは、コードがARのようなAPIに準拠していることを確認する必要があります。

to_param方法であり、これはまだ、仕事それを昔ながらの方法をやってみていない場合:

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

Clunkierが、最も可能性の高い効果的。

+0

ワウ。それはうまくいった。しかし、なぜそれは機能しましたか?私の例では、 "%23 "とは何ですか?それはアルバムオブジェクトの生の表現ではありませんか?ですから、to_paramメソッドを作成することで、オブジェクト表現の代わりにオブジェクトのidが確実に表現されるのですか?それはオブジェクトをこのコードとして表すデフォルトのto_paramメソッドがあるからです: "%23 "?素晴らしい。私はあなたがこれをどのように理解したかを知りたいです。あなたは本当にRailsの内部をかなりよく理解していなければなりません。 – Baker

+1

内部はrespond_toを行う必要がありますか? to_paramを呼び出す前に確認してください。これは、ルートメソッドも整数、配列、ハッシュを受け付けるからです。 %23 は、ActiveRecordのようなオブジェクトがそのメソッドをオーバーライドしていない限り、Rubyがinspectメソッドでオブジェクトをどのように公開するかを示す#のURLエンコーディングです。あなたのDMモデルはARや配列、ハッシュではないので、おそらく文字列補間の一部として、オブジェクトに対してto_sを呼び出すだけです。 私はルートメソッドに送信していたオブジェクトを台無しにする機会があったので、以前にこの問題を見てきました。 – austinfromboston

+0

説明していただきありがとうございます。 – Baker