Rails:RESTful查找,初始化或创建

时间:2012-04-15 23:24:26

标签: ruby-on-rails ajax rest

我有一个包含城市的应用。我正在寻找一些关于如何RESTful构建控制器的建议,以便我可以通过AJAX请求查找,初始化和创建城市记录。例如:

  • 给定文字字段city_name
  • 用户输入城市名称,例如“巴黎,法国”
  • 应用程序会检查此位置以查看数据库中是否存在此类城市
  • 如果有,则返回城市对象
  • 如果没有,则返回使用名称“Paris”和国家“France”初始化的新记录,并提示用户确认他们要将此城市添加到数据库
  • 如果用户说“是”,则保存记录。如果不是,则丢弃记录并清除表格。

现在,我的第一种方法是将创建操作更改为使用find_or_create,以便向cities_path发送AJAX帖子将导致返回现有城市或创建并返回它。

这样可行......但是,设置控制器操作会更好,这些操作会接受字符串输入,查找或初始化并返回,然后仅在用户确认生成的记录正确时才创建。理想的情况是将这一切都放在一个动作中,因此AJAX请求可以转到该URL,服务器响应JSON对象,javascript可以从那里处理事情。我想保留所有用户交互逻辑客户端,并最大限度地减少实现此目的所需的请求数。

有关最干净,最RESTful方式的任何建议吗?

1 个答案:

答案 0 :(得分:0)

一种选择是利用存在?方法:

if City.exists?(:name=>params[:city])
  @city = City.find_by_name(params[:city])
else
  @city = City.new(:name=>params[:city])
end

根据评论更新:

#show = /city/:id, :id can be int or string

def show
  if params[:id].to_i > 0
    @city = City.find(params[:id])
  elsif City.exists?(:name=>params[:id])
    @city = City.find_by_name(params[:id])
  else
    return redirect_to(:action=>:new, :name=>params[:id])
  end
end

def new
  @city = City.new(params[:name])
end