English 中文(简体)
How best to expose Rails methods via an API?
原标题:

Let s say I have a model foo, and my model has a publish! method that changes a few properties on that model and potentially a few others too.

Now, the Rails way suggests that I expose my model over rest and let the end user monkey with parameters.

What should I do if I want to expose my publish! method instead to protect my model? Is this even the best way of looking at this?

最佳回答

Since you are trying to do this in a REST way, what you need to do at first is to find a resource - some thing you can query with one of the HTTP verbs.

I d say that the "thing" we need to identify here is the status of foo. Translated into a URL:

/foos/:id/status

Status of concrete foo is a resource - and that s the first thing we need when trying to be REST compliant. When we publish some foo, it means we change (update) its status, right? So, what we need to do next is to create a route and a method which will handle the "update status of foo" request.

To do this, just add this into your routes.rb file:

map.connect "/foos/:id/status", :controller => "foos", :action => "change_status", :conditions => { :methods =>  :put }

and add something like this into your foos controller file:

# simplified
def change_status
  status_name = params[:status_name]
  foo = Foo.find(params[:id])
  foo.publish! if status_name == "published"
end

In this manner you ll end up with a quite decent RESTful design.

问题回答

You d add a method to your FooController that called the publish! method.

Example:

in config/routes.rb:

map.publish_foo "/foos/:id/publish/:bar", :controller => "foo", :action => "publish"

in app/controllers/foo_controller.rb

def publish
    @foo = Foo.find params[:id]
    @foo.publish!(params[:bar])
    flash[:notice] = "Your Foo has been published."
    redirect_to @foo
end

Of course, you probably want some error handling.





相关问题
rails collection_select vs. select

collection_select and select Rails helpers: Which one should I use? I can t see a difference in both ways. Both helpers take a collection and generates options tags inside a select tag. Is there a ...

SSL slowness in EC2

We ve deployed our rails app to EC2. In our setup, we have two proxies on small instances behind round-robin DNS. These run nginx load balancers for a dynamically growing and shrinking farm of web ...

Auth-code with A-Za-z0-9 to use in an URL parameter

As part of a web application I need an auth-code to pass as a URL parameter. I am currently using (in Rails) : Digest::SHA1.hexdigest((object_id + rand(255)).to_s) Which provides long strings like : ...

RubyCAS-Client question: Rails

I ve installed RubyCAS-Client version 2.1.0 as a plugin within a rails app. It s working, but I d like to remove the ?ticket= in the url. Is this possible?

activerecord has_many :through find with one sql call

I have a these 3 models: class User < ActiveRecord::Base has_many :permissions, :dependent => :destroy has_many :roles, :through => :permissions end class Permission < ActiveRecord::...

Ordering a hash to xml: Rails

I m building an xml document from a hash. The xml attributes need to be in order. How can this be accomplished? hash.to_xml

Text Editor for Ruby-on-Rails

guys which text editor is good for Rubyonrails? i m using Windows and i was using E-Texteditor but its not free n its expired now can anyone plese tell me any free texteditor? n which one is best an ...

How to get SQL queries for each user where env is production

I’m developing an application dedicated to generate statistical reports, I would like that user after saving their stat report they save sql queries too. To do that I wrote the following module: ...

热门标签