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]
?
答案 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 %>
但是,我想在此指出更多内容:
Script
对象,因此我不确定您为什么要从{{1}创建execute
方法},而不是仅使用show
视图中update
已经可以通过resources :scripts
提供的edit
方法。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 %>