Rails,表单调用错误的操作

时间:2015-03-06 10:15:45

标签: ruby-on-rails ruby forms routing actioncontroller

我已经成了我的表格:

      <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

remove_detail中有players_controller.rb,我已将此操作添加到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

1 个答案:

答案 0 :(得分:1)

要解决此问题,请尝试以下操作:

首先,我按照以下方式重新定义您的路线:

resources :players do
  member do
    delete 'remove_detail'
  end

  collection do
    get 'search'
  end
end

这会生成正确的网址,用于删除“detail”的Player

/players/:id/remove_detail

由于Rails的REST-y性质,我们通过执行delete请求定义了可访问的URL。

您的表单会相应更改:

<%= form_for @player, { url: { action: "remove_detail" }, method: :delete } do |f| %>

更改路由以使用delete方法更多的是保持Rails的约定。 Post会让你的应用程序也能正常工作,但是 - 它只是Rails-y方式。

祝你好运!