1

我的 Ruby on Rails Web 应用程序有问题。

我有一个名为Source的模型类,在我的routes.rb中,我添加了以下配置:

namespace :admins do
  resources :sources do
    collection do
      get 'batch_new'
      post 'batch_create'
    end
  end
end

当我运行时rake routes,我可以看到:

admins_source GET    /admins/sources/:id(.:format)  admins/sources#show
              PUT    /admins/sources/:id(.:format)  admins/sources#update
              DELETE /admins/sources/:id(.:format)  admins/sources#destroy

但是当我通过单击链接或表单提交来发送这些请求时,我总是得到 404。

这是views/admins/sources/_form.html.erb中的代码

<%= form_for [:admins, @source] do |f| %>
  <% if @source.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@source.errors.count, "error") %> prohibited this source from being saved:</h2>

      <ul>
      <% @source.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :name %>
    <%= f.text_field :name %>
  </div>

  <div class="field">
    <%= f.label :url %>
    <%= f.text_field :url %>
  </div>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

这是我在views/admins/sources/index.html.erb上的Destroy链接的代码:

<%= link_to 'Destroy', admins_source_url(source), method: :delete, data: { confirm: 'Are you sure?' } %>

这是SourcesController中的代码

def destroy
    @source = Source.find(params[:id])
    @source.destroy

    respond_to do |format|
      format.html { redirect_to admins_sources_url }
      format.json { head :no_content }
    end
end

这个问题只发生在生产环境中。开发环境刚刚好。

在启动我的服务器(独角兽)之前,我还为生产环境进行了资产预编译。我不知道如何解决这个问题。

这是我的环境:

操作系统:Ubuntu Linux 12.04 LTS

红宝石版本:2.0.0-p0

导轨版本:3.2.13

Rails 服务器:独角兽 4.6.2

生产数据库:MySQL

开发数据库:sqlite3

4

2 回答 2

0

我终于找到了解决方案。是浏览器在点击超链接时不能发送除GET以外的请求,即使该属性data-method="delete"存在。

我已经删除了SourcesController#show和相应的视图,因为源非常简单,甚至index.html.erb都可以显示所有源的所有详细信息。

由于这次删除,/admins/sources/:id 上的 GET 请求应该是 DELETE 失去了它的目标视图。

我变了

<%= link_to 'Destroy', admins_source_url(source), method: :delete, data: { confirm: 'Are you sure?' } %>

<%= button_to 'Destroy', admins_source_url(source), method: :delete %>

然后一切都很好,除了确认消息,但这并没有让我太困扰。

但是,还有一个问题:在开发环境下请求是如何发送的,因为超链接可以:method => :delete正常工作?

于 2013-05-07T03:01:11.563 回答
0

您收到错误是因为您有一些其他错误(例如有问题的迁移或未编译的资产)。只需查看生产日志即可找到真正的错误,因为您在此处发布的内容应该可以正常工作(如果您有 1K 点,我不会问这个,如果您确实检查了这些日志,抱歉:))

于 2013-05-06T14:39:44.070 回答