20080908

AtomPubサーバの開発中

いろいろ問題があった。

次のように、respond_toでatomへの対応が出来るはずなのだが、最初はうまくいってなかった。atomであるという認識が出来ずに、クライアントに406が戻ってしまう。


 def create
       parse_request_xml
       @blog = Blog.find(params[:blog_id])
       @post = Post.new(params[:post])
   
       respond_to do |format|
         if @post.save
           flash[:notice] = 'Post was successfully created.'
           format.html {
             redirect_to(blog_post_path(@blog, @post))
           }
           format.xml  {
             render :xml => @post, :status => :created, :location => @post
           }
           format.atom {
             render :action => :show,
                    :status => :created,
                    :content_type => "application/atom+xml;type=entry",
                    :locaton => formatted_blog_post_path(@blog, @post, :atom)
           }
         else
           format.html { render :action => "new" }
           format.xml  { render :xml => @post.errors, :status => :unprocessable_entity }
           format.atom { render :xml => @post.errors, :status => :unprocessable_entity }
         end
       end
     end

うもformatがatomであるという認識が出来ていないらしいので、params[:format]='atom'と強制的に入れてしまうことにした。すると上手くいくようになったが、何故だかは不明だ。


 private
     def parse_request_xml
       if request.format = Mime::ATOM
         xml = REXML::Document.new(request.raw_post)
         params[:post] = {
           :title => xml.elements["entry/title"].text,
           :content => xml.elements["entry/content"].text,
           :updated_at => xml.elements["entry/updated"].text,
           :blog_id => params[:blog_id],
           :user_id => @user.id
         }
         params[:format] = 'atom'
       end
       return true
     end

続く)

s atompubサーバの開発中

f markdown

u b9e65f41-2a53-41b8-a8b1-ffff73850ed6