【问题标题】:Rails 3 Admin NamespaceRails 3 管理员命名空间
【发布时间】:2011-07-14 01:37:18
【问题描述】:

我正在尝试为 cms 创建一个管理后端。

所以我有一个站点模型、一个 SitesController 和一个 Admin:SitesController。

在 /app/views/sites/show.html 和 /app/views/admin/sites/index.html、new.html 等中。

routes.rb

  namespace :admin do 
    resources :sites, :except => :show
  end

  match '/:slug' => 'sites#show'

编辑

日志输出

Started POST "/admin/sites" for 127.0.0.1 at 2011-07-13 19:03:12 +0200
  Processing by Admin::SitesController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"8IVTjl6ewasDuBEN6OgczTSdRfxSRPLmPodkrbZEKB8=", "site"=>{"title"=>"Test", "content"=>"abc", "slug"=>"home"}, "commit"=>"Create Site"}
  SQL (1.1ms)  INSERT INTO "sites" ("content", "created_at", "slug", "title", "updated_at") VALUES (?, ?, ?, ?, ?)  [["content", nil], ["created_at", Wed, 13 Jul 2011 17:03:12 UTC +00:00], ["slug", nil], ["title", nil], ["updated_at", Wed, 13 Jul 2011 17:03:12 UTC +00:00]]
Redirected to http://localhost:3000/admin/sites
Completed 302 Found in 12ms

Rails 不会使用表单中的参数创建记录。有什么想法吗?

这些是方法和视图:

admin/sites#new

  def new
    @site = Site.new

    respond_to do |format|
      format.html # new.html.erb
    end
  end

admin/sites#create

定义创建 @site = Site.new(params[:site])

respond_to do |format|
  if @site.save
    format.html { redirect_to admin_sites_path, notice: 'Site was successfully created.' }
  else
    format.html { render action: "new" }
  end
end

admin/sites/_form

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

      <ul>
      <% @site.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>
  <div class="fields">
    <%= f.label :title %><br/>
    <%= f.text_field :title %>
  </div>
  <div class="fields">
    <%= f.label :content %><br/>
    <%= f.text_area :content %>
  </div>
  <div class="fields">
    <%= f.label :slug %><br/>
    <%= f.text_field :slug %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3.1


    【解决方案1】:

    你应该redirect_to

     [:admin, :sites]
    

    用于索引页

    UPD

    <%= form_for(@site, :url => [:admin, @site]) do |f| %>
    

    【讨论】:

    • 感谢您的回复。站点索引的 redirect_to 正在工作。如果数据库中没有记录,则显示索引页面而不会出错。我一创建记录,就会显示错误。 Rails 不会保存表单中的参数。数据库中的每个字段都设置为零...知道为什么吗?
    • 你不懂,好吧。 @admin_sites 是什么? redirect_to [:admin, @admin_sites] 应该重定向到哪里?
    • @admin_sites 只是站点的变量。我已将redirect_更改为admin_sites_path。那行得通,因为我不需要重定向到显示视图。
    • @Daniel,复数 @admin_sites 对于一个站点来说是可变的?凉爽的。而redirect_to admin_sites_pathredirect_to [:admin, :sites] 相同。所以我还是不明白你的问题。
    • 重定向不是问题。问题是,该站点不是使用表单中的参数创建的。我更新了问题。
    【解决方案2】:

    运行rake routes 以查看您的路线。

    如果您使用脚手架,您的 Admin::SitesController 中可能有 redirect_to @siteredirect_to sites_path 之类的代码。您需要通过并将它们更改为适当的命名路线,例如redirect_to admin_site_path(@site)admin_sites_path

    【讨论】:

    • 在创建站点记录后帮助重定向。但现在的问题是,表单中的参数没有保存在数据库中,数据库中的每个字段都是 nil。
    • 如果您在模型上使用attr_accessible,请确保包含您想要的字段:attr_accessible :content, :slug, :title
    【解决方案3】:

    你的创建表单应该是这样构建的:

    <%= form_for [:admin, @site] do |f| %>
      // form fields go here
    <% end %>
    

    这将创建一个发布到 Admin::SitesController#create 的表单,除非您的索引视图或控制器操作将 @site 设置为现有记录而不是 @site = Site.new。如果您将@site 设置为现有记录,那么会将form_for 更改为PUT 以更新操作,并且当您使用form_for @site ... 而不是form_for [:admin, @site] 时,会将其发送到SitesController 而不是Admin::SitesController .您提供的错误看起来像是您犯了这两个错误。

    【讨论】:

    • 感谢您的回复 =D 不幸的是,这不是错误。我已经更新了这个问题。日志的输出表明它进入了 create 方法。
    • 在问题中,您现在显示的错误与我回答问题时的错误完全不同(在 SitesController 中没有“更新”操作的效果)。如果一个问题得到解决并且您有后续问题,那么您应该提出一个单独的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    • 2015-04-05
    • 2014-06-12
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    相关资源
    最近更新 更多