【问题标题】:Wrong path for nested controller in RailsRails 中嵌套控制器的路径错误
【发布时间】:2018-04-05 00:59:05
【问题描述】:

当我尝试在 Url http://localhost:3000/operations/OPERATION_ID/agents/AGENT_ID/jobs/meterpreter/new 创建新工作时

undefined method `operation_agent_meterpreters_path' for #<#<Class:0x007ff2f7822638>:0x007ff2f9a7e0d8>
Did you mean?  operation_agent_jobs_meterpreter_path

我有以下路线

Rails.application.routes.draw do


  get 'agents/index'

  get 'agents/show'

  devise_for :users

  resources :operations do
    resources :agents do
      namespace :jobs do
        resources :meterpreter
      end
    end
  end

  root 'operations#index'
end

工作中的控制器/

class Jobs::MeterpreterController < ApplicationController

  def new
    @operation = Operation.find params[:operation_id]
    @agent = Agent.find params[:agent_id]
    @job = MeterpreterJob.new agent: @agent
  end

  private

  def jobs_params
    params.require(:job).permit(:ip, :port)
  end
end

型号

class Jobs::Meterpreter < Job
    jsonb_accessor :options,
        ip: :string,
        port: :integer

    #== VALIDATIONS
    validates :ip, :port, presence: true
end

还有jobs/meterpreter/new.html.erb中的表单视图

<div class="card">
    <h4 class="card-header">New Meterpreter Job</h4>
  <div class="card-body">
  <%= form_with model: [@operation, @agent, @job] do |form| %>
      <div class="form-row">
        <div class="col-8">
            <label for="name" class="col-form-label">Name:</label>
          <%= form.text_field :ip, class: "form-control", placeholder: "0.0.0.0", required: true %>
        </div>
        <div class="col-4">
            <label for="name" class="col-form-label">Name:</label>
          <%= form.text_field :port, class: "form-control", placeholder: "443", required: true %>
        </div>
      </div>
      <%= form.submit "Create", class: "btn btn-primary mt-4" %>
    <% end %>
  </div>
</div>

所有路线https://gist.github.com/drale2k/a25c4cbffe8c5e6446df2141a393cd17

【问题讨论】:

  • 能否分享rails routes的输出?
  • 由于某种原因我无法编辑该条目。这里是轮播gist.github.com/drale2k/a25c4cbffe8c5e6446df2141a393cd17
  • 我没有在 form_with 中使用过多个模型,尽管我在 PR 中看到 form_with(model: [ @post, Comment.new ]) 相同。此外,彼得有一个答案。您能否尝试让我们知道是否还有其他问题。该错误主要是因为没有名为operation_agent_meterpreter_jobs_path 的路由显然是由form_with 创建的

标签: ruby-on-rails routing


【解决方案1】:

这段代码现在存在一些问题:

  • 在您的路由中,resources 和 :meterpreter 之间存在多个不匹配。如果系统中有多个 Meterpreter 作业,它们都应该是复数,即。 resources :meterpreters。

  • 控制器应始终以复数命名,遵循 Rails 约定,即。 Jobs::MeterpretersController。您必须重命名控制器文件和视图文件夹。

  • Jobs::Meterpreter 和 MeterpreterJob 之间的命名不匹配。我不知道那里发生了什么,我认为它们应该是相同的。

但是对于主要问题:

  • 您已经定义了路由命名空间:jobs,这意味着/jobs/ 必须是URL 的一部分,但您没有在form_with 标记中包含该命名空间。它应该包括命名空间,即。 &lt;%= form_with model: [@operation, @agent, :jobs, @job] do |form| %&gt;

我还会问自己是否真的需要像 /operations/123/agents/345/jobs/meterpreters/567 这样的 URL。这是一个非常长的 URL,可能包含一些不必要的信息,为简洁起见应该删除。

【讨论】:

  • 谢谢,虽然重命名为 Model and Controller MeterpreterJobs 后,它只是在不改变表单的情况下工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-05
  • 2017-02-12
  • 1970-01-01
  • 1970-01-01
  • 2015-07-28
  • 1970-01-01
相关资源
最近更新 更多