了解Rails中的路由

时间:2009-09-09 16:21:56

标签: ruby-on-rails

我实际上有两个问题。我已经阅读了Rails指南和其他几篇文章,但我无法将我读到的内容翻译成工作路线。我有一个应用程序,允许从几个不同的上下文上传图像。我希望URI表达正确的上下文,以便以下URI访问同一页面:

/images/upload
/photos/upload

在此示例中,我已覆盖new_image_path以使用upload作为描述目的。我有覆盖工作,但使用:as将图片映射到照片只能以一种方式工作(:as => 'photos'到位,/images路由不起作用)。有没有办法让多条路线指向同一个地方?

我还有几种不同的方式来上传图片/照片等。标准方法,每个表单包含一个图像或批处理方法,用户上传zip文件并提取该存档,并保存每个图像。

这样做最具语义性的方法似乎是通过向URI添加处理程序组件(例如/images/upload/batch),但我不知道如何处理它。对于图像只需要的东西,默认的路径路径看起来非常普遍,但我也不希望对整个位的命名路由如此具体。做这样的事情最好的方法是什么?

感谢。

更新:根据jonnii对我的第一个问题的回答,我已将以下内容添加到我的routes.rb文件中:

map.resources :images, :path_names => { :new => 'upload' }
map.resources :photos, :controller => 'Images', :path_names => { :new => 'upload' }

这似乎可以让我可以互换地使用/images//photos/

2 个答案:

答案 0 :(得分:1)

我假设您正在使用资源进行照片路径:

map.resources :photos

如果是这种情况,您应该能够定义指向与照片资源相同的控制器的第二个资源:

map.resources :uploads, :controller => 'PhotosController'

我没有测试过这个,但我不明白为什么这样的东西不起作用..


问题2:

您可以通过几种不同的方式进行批量上传,我认为最好的方法是拥有一个单独的资源,因为您最有可能拥有不同的用户界面。例如,你可以这样做:

map.resources :batch_uploads

如果你打算将批量上传作为拉链,这可能就足够了。

一个稍微复杂一些的选项,但是利用了rails niceties(并且说实话,谁不想利用它?)是嵌套子表单和accepts_nested_attributes_for的东西。如果您希望允许用户在一次将多个图像附加到表单,这将非常有用。

例如,如果您的模型类似于:

class User < AR:B
  has_many :photos
end

你可以有一条路线:

map.resources :users do |u|
  u.resources :photos, :collection => {:get => :new_batch, :post => create_batch}
end

在您的new_batch视图中,您将拥有form_for @user user_form.fields_for :photos。您可以使用ajax添加新表单,无论如何都要一次性发布。

如果你想保留与现在相同的语义并且不想再添加任何路由,你可以扩展你的模型,根据上传的文件名做一些不同的事情。

例如,如果您使用回形针作为附件,如果文件名以.zip结尾,则可以停止处理附件(此代码不保证可以正常工作,我是从内存中执行的):

def is_zip?
    attachment.filename.ends_with?('.zip')
end

before_attachment_process do |attachment|
  false if is_zip?
end

before_filter :process_bulk_attachment, :if => :is_zip?
def process_bulk_attachment
    ... extract the zip and save each image in it ...
    false
end

它的美妙之处在于它是模型的一部分。你应该始终瞄准胖模特和瘦小的控制器!

我希望这会给你一些想法和/或指出正确的方向。

答案 1 :(得分:0)

我已经接近了我的目标:

map.resources :images, :path_names => { :new => 'upload' }
map.resources :images, :new => { :batch => :get }

前者允许我使用/images/upload代替/images/new,如jonnii对我的第一个问题的回答所示。后者允许我通过调用/images/new/batch的{​​{1}}指定通向“新”功能的第二条路径。我希望能够使用ImagesController#batch,但这可能需要做。

显然,在我真正理解Rails中的路由之前,我还有很长的路要走。 jonnii,如果我只是重复你已经说过的一部分,我道歉。对于你对问题2的大部分答案,我可能不得不恳求无知。