【问题标题】:Changing routes after adding admin functionality with devise使用设计添加管理功能后更改路线
【发布时间】:2017-04-06 20:13:39
【问题描述】:

这个问题会有点令人费解,因为我是 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| %>

但它似乎需要一个对象作为输入,而不是路径。

再次,我意识到可能有更好的方法来做到这一点,所以如果你有建议,我会全力以赴。谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby devise que


    【解决方案1】:

    你可以写完整的路由器admin_form_defs_questions_path(@form_defs)或者你可以定义命名空间link_to [:admin, @form_defs]

    【讨论】:

    • 我试过了,但不幸的是,在我的具体情况下,这并不完全有效。我在帖子中添加了更多说明,因为我的问题不一定与“link_to”相关(我应该更好地解释这一点),但它似乎以某种方式与路由/路径相关联。很抱歉造成混乱!
    【解决方案2】:

    从事过类似的项目。我们以同样的方式处理管理/用户界面。

    您需要开始做的是停止依赖 Rails 为您猜测事物,并手动指定它们。

    例如

    <%= 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) %>
    

    这让您可以很好地控制用户可以查看/执行的内容与管理员可以查看/执行的内容之间的划分

    【讨论】:

    • 很高兴知道。我只是认为像这样的硬编码通常被认为是不好的做法,所以我们试图避免它。 "render partial:" 和 "locals:" 到底是做什么的?此外,我在帖子中添加了更多说明,因为我的问题与 link_to 不完全相关,而是与对象和表单构建器相关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    相关资源
    最近更新 更多