这个问题会有些复杂,因为我是RoR的新手,但被扔进了一个相对较大的RoR项目中。为此,我深表歉意,但我会尽力说清楚。我欣然承认,我们一开始可能犯了可怕的错误。
所以无论如何,情况是这样的:
-
我们最初试图恢复一些由专业公司构建的遗留代码并接近,但最终没有成功。
-
正因为如此,我们重新开始了一个新项目,并使用脚手架来构建我们项目的结构。
我们 使用了来自遗留项目的相当数量的代码,但最终添加的代码比我们实际使用的要多得多。现在我们真的不确定什么需要,什么不需要。
长话短说,我们有一个工作项目,但最近尝试使用 devise 按用户和管理员分离我们的功能(我不完全确定在多大程度上)。在此过程中,我们将管理控制器和视图分离到一个管理子文件夹中,这样我们就有了"/controllers/admin/events"和"/controllers/events",我们的视图也是如此。这个想法是,然后我们为管理员和用户提供了一个单独的视图(再次,相当确定这不是执行此操作的正确方法)。
我几乎可以肯定我们做错了,但它最终让我想到了这个问题:
我们更改了 routes.rb 以将我们的资源包含在管理命名空间下,如下所示:
namespace :admin do
resources :form_defs do
resources :questions
end
end
但是当我尝试像我们最初所做的那样做类似"link_to @form_defs"的事情时,它仍然试图路由到form_defs_questions_path而不是admin_form_defs_questions_path
我认为我的问题只是如何更改类以使其正确路由?
如果有更好的方法,我们应该这样做,不涉及基本上重新开始项目,我全都听着。
我想我需要更改默认情况下我的对象路由到的位置:
我遇到的代码是一个表单生成器,可以创建一个新问题。这是我们为此使用的代码:
<div id="new-question-form">
<h2 id="add-question-title">Add Question</h2>
<%= form_for([@form_def,@form_def.questions.build]) do |f| %>
<div class="new-question-field">
<strong><%= f.label :format %></strong>
<%= f.select(:format, [["Short Answer","1"]]) %>
</div>
<div class="new-question-field">
<strong><%= f.label :title %></strong>
<%= f.text_field :title %>
</div>
<div class="actions">
<%= f.submit "Add Question", :class => "small-gray-button", :id => "add-question-button"%>
</div>
<% end %>
</div>
导致问题的特定行是这样的:
<%= form_for([@form_def,@form_def.questions.build]) do |f| %>
我查找了"form_for()"的文档,但作为 RoR 的新手,解释并没有多大帮助。
因此,当我在代码中达到这一点时,它显然试图路由到"form_def_questions_path"而不是"admin_form_def_questions_path"。我试过制作它:
<%= form_for([admin_form_def_questions_path(@form_def),@form_def.questions.build]) do |f| %>
但它似乎需要一个对象作为输入,而不是路径。
再一次,我意识到可能有更好的方法来做到这一点,所以如果你有一个建议,我会全力以赴。谢谢!
您可以编写完整的路由器admin_form_defs_questions_path(@form_defs)
也可以定义命名空间link_to [:admin, @form_defs]
做过类似的项目。我们以同样的方式处理管理员/用户界面。
你需要开始做的是停止依赖轨道来猜测你的东西,并手动指定它们。
例如
<%= render @form_defs %>
<%= link_to @form_defs %>
将变成这样:
<%= render partial: 'admin/form_defs/questions', locals: {form_defs: @form_defs} %>
<%= link_to admin_form_defs_questions_path(@form_defs) %>
这使您可以很好地控制用户可以查看/执行的操作与管理员可以查看/执行的操作之间的拆分