0

我在我的 Rails 应用程序中使用 STI:

class Project < ActiveRecord::Base
end

class Video < Project
end

我有以下路线:

resources :projects
resources :videos, :controller => "projects", :type => "video"

当我搜索我的路线时,我发现我应该能够发布到 /videos:

POST   /videos(.:format)   projects#create {:type=>"video"}

但是,当我访问 /videos/new 时,我注意到表单发布到 /projects

= form_for(@project) do |f|

... creates the following HTML ...

<form action="/projects" method="post" >
  <!-- ommited -->
</form

我在 projects_controller 中的新操作如下所示:

def new
  @project = params[:type].capitalize.constantize.new
end

def create 
  @project = params[:type].capitalize.contstantize.new(project_params)
end

我希望它发布到 /videos 而不是 /projects,因为当我们使用以 /videos 开头的 url 时,params[:type] 总是设置为“video”,而当我们使用以 /videos 开头的 url 时,它不会设置为任何内容与/项目。

更新:

我有一个临时修复:

= f.hidden_field :type

当 url 更改为 /projects 时有诀窍,但我宁愿将表单发布到 /videos...

4

3 回答 3

0

我已将问题标记为删除,因为我的代码中有以下内容:

def self.inherited(child)
  child.instance_eval do
    def model_name
      Project.model_name
    end
  end
  super
end

删除后,一切都按我想要的方式工作。哎呀。对不起!

于 2013-10-27T18:52:06.427 回答
0

form_for标签允许您通过设置url选项来更改您发布的 URL,如下所示:

form_for(@project, :url => "/videos")

于 2013-10-27T18:46:40.700 回答
0

我宁愿保留这样的路线

resources :projects
resources :videos

并为视频制作一个新的控制器,例如

class VideosController < ProjectsController
    #actions for Video
end
于 2013-10-27T18:32:11.630 回答