Rails,表单正在调用错误的操作
Rails, form is calling wrong action
我已经制作了表格:
<tbody>
<% @player.bases.each do |basis| %>
<td><%= basis.id %></td>
<td><%= image_tag(basis.image_url(:thumb), class: 'thumbnail') %></td>
<td><%= link_to basis.name, basis %></td>
<td><%= basis.cost %></td>
<td><%= basis.short_info %></td>
<td>
<%= form_for @player, url: {:controller => 'players', :action => :remove_detail} do |f| %>
<%= f.hidden_field :type, :value => 'basis' %>
<%= f.hidden_field :detail_id, :value => basis.id %>
<%= f.submit 'Remove',class: 'btn btn-danger' %>
<% end %>
</td>
<% end %>
</tbody>
在我的路线中,我添加了这个:
resources :players do
collection do
get 'search'
post 'remove_detail'
end
end
我的 players_controller.rb
中有 remove_detail
,我已将此操作添加到 before_action
以获取当前玩家。但是,当我按下删除按钮时,它会抛出错误并尝试对我的控制器执行 运行 update
操作。为什么?
我的before_action
:
before_action :set_player, only: [:show, :edit, :update, :destroy, :remove_detail]
我的remove_detail
:
def remove_detail
type = params['type']
id = params['detail_id']
if type == 'basis'
basis = Basis.find(id)
name = basis.name
@player.bases.delete(basis)
end
redirect_to @player, notice: "#{name} detail is removed"
end
要解决这个问题,请尝试以下操作:
首先,我将按如下方式重新定义您的路线:
resources :players do
member do
delete 'remove_detail'
end
collection do
get 'search'
end
end
这将为删除 "single Player
" 的 detail
生成适当的 url:
/players/:id/remove_detail
由于 Rails 的 REST-y 性质,我们将 url 定义为可通过执行 delete
请求访问。
您的表单相应更改:
<%= form_for @player, { url: { action: "remove_detail" }, method: :delete } do |f| %>
将您的路由更改为使用 delete
方法更多是为了保持 Rails 的约定。 Post
也会使您的应用程序正常工作,但是 - 它只是 Rails-y 方式。
祝你好运!
我已经制作了表格:
<tbody>
<% @player.bases.each do |basis| %>
<td><%= basis.id %></td>
<td><%= image_tag(basis.image_url(:thumb), class: 'thumbnail') %></td>
<td><%= link_to basis.name, basis %></td>
<td><%= basis.cost %></td>
<td><%= basis.short_info %></td>
<td>
<%= form_for @player, url: {:controller => 'players', :action => :remove_detail} do |f| %>
<%= f.hidden_field :type, :value => 'basis' %>
<%= f.hidden_field :detail_id, :value => basis.id %>
<%= f.submit 'Remove',class: 'btn btn-danger' %>
<% end %>
</td>
<% end %>
</tbody>
在我的路线中,我添加了这个:
resources :players do
collection do
get 'search'
post 'remove_detail'
end
end
我的 players_controller.rb
中有 remove_detail
,我已将此操作添加到 before_action
以获取当前玩家。但是,当我按下删除按钮时,它会抛出错误并尝试对我的控制器执行 运行 update
操作。为什么?
我的before_action
:
before_action :set_player, only: [:show, :edit, :update, :destroy, :remove_detail]
我的remove_detail
:
def remove_detail
type = params['type']
id = params['detail_id']
if type == 'basis'
basis = Basis.find(id)
name = basis.name
@player.bases.delete(basis)
end
redirect_to @player, notice: "#{name} detail is removed"
end
要解决这个问题,请尝试以下操作:
首先,我将按如下方式重新定义您的路线:
resources :players do
member do
delete 'remove_detail'
end
collection do
get 'search'
end
end
这将为删除 "single Player
" 的 detail
生成适当的 url:
/players/:id/remove_detail
由于 Rails 的 REST-y 性质,我们将 url 定义为可通过执行 delete
请求访问。
您的表单相应更改:
<%= form_for @player, { url: { action: "remove_detail" }, method: :delete } do |f| %>
将您的路由更改为使用 delete
方法更多是为了保持 Rails 的约定。 Post
也会使您的应用程序正常工作,但是 - 它只是 Rails-y 方式。
祝你好运!