Rails自定义操作缺少必需的键错误

时间:2016-11-04 11:45:46

标签: ruby-on-rails routing routes rails-routing

show.html.erb

<h1><%= @script.Name %></h1>

<%= simple_form_for @script , :url => script_execute_path do |f| %>
  <%= f.input :mainDirectory %>
  <%= f.input :customFilePath %>
  <%= f.button :submit, 'Run' %>
<% end %>

的routes.rb

  root :to => "scripts#index"
  resources :scripts do
    get "execute"
  end

模型

class AddNameToScript < ActiveRecord::Migration
  def change
    add_column :scripts, :Name, :string
    add_column :scripts, :Description, :text
  end
end

execute是我添加的自定义操作,我想从show转到该操作。

的routes.rb

...
    script_execute GET    /scripts/:script_id/execute(.:format) scripts#execute
...

但我收到错误

No route matches {:action=>"execute", :controller=>"scripts", :id=>"1"} 
missing required keys: [:script_id]

但为什么我需要[:script_id]?这不是一个自定义动作,我可以定义我想要的方式吗?这里缺少什么,如何通过[:script_id]

2 个答案:

答案 0 :(得分:1)

正如您从路由器输出中看到的那样,execute 期待script_id参数(/scripts/:script_id/execute(.:format)。要删除该期望,您需要在collection而不是member级别声明该路线。您可以通过以下两种方式之一完成此操作:

get :execute, on: :collection

或者,如果您要在集合中包含其他路线,则可以将其放入块中:

collection do
  get :execute
end

仅供参考,在此更改后再次运行rake routes | grep execute以查看URL帮助程序的名称已更改为什么,以便您可以相应地更新视图。

干杯!

更新

要回答评论中的问题,如果您想传入script_id参数(或任何参数),可以将其声明为URL帮助程序的参数。因此,根据您当前的观点,它看起来像这样:

<h1><%= @script.Name %></h1>

<%= simple_form_for @script , :url => script_execute_path(script_id: @script.id) do |f| %>
  <%= f.input :mainDirectory %>
  <%= f.input :customFilePath %>
  <%= f.button :submit, 'Run' %>
<% end %>

但是,我想在此指出更多内容:

  1. 您似乎打算更新Script对象,因此我不确定您为什么要从{{1}创建execute方法},而不是仅使用show视图中update已经可以通过resources :scripts提供的edit方法。
  2. 同样,您似乎打算根据您的观点投放或发布内容,但您的execute路由被定义为GET。不确定这是不是你想要的。

答案 1 :(得分:-1)

:id传递给表单助手并尝试

<%= simple_form_for @script , :url => script_execute_path(@script) do |f| %>
  <%= f.input :mainDirectory %>
  <%= f.input :customFilePath %>
  <%= f.button :submit, 'Run' %>
<% end %>