【问题标题】:Rails 4 content_for and yield displays blank pageRails 4 content_for 和 yield 显示空白页
【发布时间】:2015-06-05 14:38:47
【问题描述】:

我正在尝试渲染以下部分:

<% content_for :admin_content do %>
  <h3>Listing All Accounts</h3>
    <%= paginate (@accounts) %>
    <table id="indexTable" class="table table-striped">
      ...
    </table>
    <%= paginate (@accounts) %>
  <br>

  <%= link_to 'New Account', new_account_path %>
<% end %>

(还有其他类似的部分)

...在以下布局中:

<!DOCTYPE html>
<html>
<head>
...
</head>
<body>
    <%= render 'navigation' %>
    <% if notice %>
      <p class="alert alert-success"><%= notice %></p>
    <% end %>
    <% if alert %>
      <p class="alert alert-danger"><%= alert %></p>
    <% end %>
    <main>
        <%= render partial: 'admin_navigation' %>
        <%= yield :admin_content %>
    </main>
    <footer>
...
    </footer>
</body>
</html>

我尝试使用 content_for 的原因是我有几个与上述部分类似的其他页面,我想在导航中单击链接时呈现它们:

<div id="panel">
  <div class="navbar subnav navbar-inverse admin-nav" role="navigation">
    <div class="navbar-inner">
      <div class="container-fluid">
        <h2>Admin Dashboard</h2>
        <ul class="pager subnav-pager">
          <div class="btn-group btn-group-justified" role="group" aria-label="navigation">
            <span role=button><%= link_to "Manage Accounts", {:action=>"manage_accounts"}, :class => "btn btn-primary" %></span>
            <span role=button><%= link_to "Manage Customers", {:action=>"manage_customers"},  :class => "btn btn-primary" %></span>
            <span role=button><%= link_to "Manage Transactions", {:action=>"manage_acct_transactions"},  :class => "btn btn-primary" %></span>
          </div>
        </ul>
      </div>
    </div>
  </nav>
</div>

以上链接调用了控制器中的相应方法,如下:

def manage_accounts
    @accounts = Account.order('id').page(params[:page]).per(15)
    render partial: 'manage_accounts'
  end

  def manage_customers
    @customers = Customer.order('lastname').page(params[:page]).per(15)
    render partial: 'manage_customers'
  end

  def manage_acct_transactions
    @acct_transactions = AcctTransaction.order('date DESC').page(params[:page]).per(15)
    render partial: 'manage_acct_transactions'
  end

但是当您单击导航中的链接时,它只会显示一个没有 html 的空白页面。控制台说对象是根据控制器加载的,并且正在渲染部分对象。 但它在哪里?

我已经尝试了各种方法来让它发挥作用。我得到的最接近的实际上是没有 content_for/yield 并且只是调用该方法,这当然会将部分呈现为好像它是它自己的页面(坏)。曾经有一个名为 replace_html 的东西可能适用于我正在尝试做的事情,但我使用的是 Rails 4.1.8

最初,我使用 AJAX 设置此导航,但它在这里不起作用。这些部分具有 CRUD 操作和重定向的链接。使用 AJAX 会导致各种 CSRF 错误,并且似乎为应该非常简单的事情增加了不必要的复杂性。

为什么上面的代码没有渲染任何东西?

我是否采取了错误的方法?

谢谢

编辑:为页面请求添加日志..

Started GET "/administrators/145a435c-6632-4d54-aca3-5e834b9e2d41/adminview" for 127.0.0.1 at 2015-04-01 07:58:41 -0400
Processing by AdministratorsController#adminview as HTML
  Parameters: {"id"=>"145a435c-6632-4d54-aca3-5e834b9e2d41"}
  [1m[36mUser Load (0.6ms)[0m  [1mSELECT  `users`.* FROM `users`  WHERE `users`.`id` = x'145a435c66324d54aca35e834b9e2d41'  ORDER BY `users`.`id` ASC LIMIT 1[0m
  Rendered administrators/adminview.html.erb within layouts/admin (13.7ms)
  Rendered application/_navigation.html.erb (1.4ms)
  Rendered application/_admin_navigation.html.erb (1.8ms)
Completed 200 OK in 212ms (Views: 206.9ms | ActiveRecord: 0.6ms)


Started GET "/administrators/145a435c-6632-4d54-aca3-5e834b9e2d41/manage_accounts" for 127.0.0.1 at 2015-04-01 07:58:45 -0400
Processing by AdministratorsController#manage_accounts as HTML
  Parameters: {"id"=>"145a435c-6632-4d54-aca3-5e834b9e2d41"}
  [1m[35mUser Load (0.6ms)[0m  SELECT  `users`.* FROM `users`  WHERE `users`.`id` = x'145a435c66324d54aca35e834b9e2d41'  ORDER BY `users`.`id` ASC LIMIT 1
  [1m[36m (49.0ms)[0m  [1mSELECT COUNT(*) FROM `accounts`[0m
  [1m[35mAccount Load (11.8ms)[0m  SELECT  `accounts`.* FROM `accounts`   ORDER BY id LIMIT 15 OFFSET 0
  [1m[36mCustomer Load (12.7ms)[0m  [1mSELECT  `customers`.* FROM `customers`  WHERE `customers`.`id` = 490181591 LIMIT 1[0m
  [1m[35mCustomer Load (0.7ms)[0m  SELECT  `customers`.* FROM `customers`  WHERE `customers`.`id` = 189365990 LIMIT 1
  [1m[36mCustomer Load (0.5ms)[0m  [1mSELECT  `customers`.* FROM `customers`  WHERE `customers`.`id` = 24420774 LIMIT 1[0m
  [1m[35mCustomer Load (0.5ms)[0m  SELECT  `customers`.* FROM `customers`  WHERE `customers`.`id` = 772684056 LIMIT 1
  [1m[36mCustomer Load (0.5ms)[0m  [1mSELECT  `customers`.* FROM `customers`  WHERE `customers`.`id` = 862455622 LIMIT 1[0m
  [1m[35mCustomer Load (0.4ms)[0m  SELECT  `customers`.* FROM `customers`  WHERE `customers`.`id` = 417734356 LIMIT 1
  [1m[36mCustomer Load (0.4ms)[0m  [1mSELECT  `customers`.* FROM `customers`  WHERE `customers`.`id` = 220490343 LIMIT 1[0m
  [1m[35mCustomer Load (0.4ms)[0m  SELECT  `customers`.* FROM `customers`  WHERE `customers`.`id` = 685817728 LIMIT 1
  [1m[36mCustomer Load (0.4ms)[0m  [1mSELECT  `customers`.* FROM `customers`  WHERE `customers`.`id` = 53991993 LIMIT 1[0m
  [1m[35mCustomer Load (0.4ms)[0m  SELECT  `customers`.* FROM `customers`  WHERE `customers`.`id` = 676540929 LIMIT 1
  [1m[36mCustomer Load (0.4ms)[0m  [1mSELECT  `customers`.* FROM `customers`  WHERE `customers`.`id` = 726000565 LIMIT 1[0m
  [1m[35mCustomer Load (0.4ms)[0m  SELECT  `customers`.* FROM `customers`  WHERE `customers`.`id` = 554199658 LIMIT 1
  [1m[36mCustomer Load (0.6ms)[0m  [1mSELECT  `customers`.* FROM `customers`  WHERE `customers`.`id` = 767280416 LIMIT 1[0m
  [1m[35mCustomer Load (0.6ms)[0m  SELECT  `customers`.* FROM `customers`  WHERE `customers`.`id` = 237301229 LIMIT 1
  [1m[36mCustomer Load (0.6ms)[0m  [1mSELECT  `customers`.* FROM `customers`  WHERE `customers`.`id` = 209732030 LIMIT 1[0m
  Rendered administrators/_manage_accounts.html.erb (194.7ms)
Completed 200 OK in 217ms (Views: 132.9ms | ActiveRecord: 80.8ms)

另外,如果这有助于解决这个问题,这里是 routes.rb..

Rails.application.routes.draw do
  devise_for :users, :controllers => { :registrations => "registrations" }
  devise_scope :user do
    post "/accounts/adminview" => "devise/sessions#new"
  end

  root 'home#index'
  get 'home/about'
  get 'home/help'
  get 'accounts/add_account', to: 'accounts#new'
  post 'accounts/add_account', to: 'accounts#create'

  resources :administrators do
    member do
      get :adminview
      get :manage_accounts
      get :manage_customers
      get :manage_acct_transactions
    end
  end

  resources :users do
    resource :customers
    resource :accounts
    resource :addresses
  end

  resources :accounts do
    resource :acct_transactions
  end

  resources :account_types, :accounts, :addresses, :administrators, :customers, :transaction_types, :acct_transactions, :users

end

再次,根据日志,它应该正在加载部分 _manage_accounts,但我只看到一个空白页面。我试过使用路径助手,但它会引发“缺少模板”错误。尝试了很多其他的东西,而不是 action 方法,但我仍然得到相同的结果。

【问题讨论】:

  • 你没有把主要的yield
  • @MohammadAbuShady 在上面的 html 块中,我已经输入了 &lt;%= yield :admin_content %&gt;。我也尝试过简单的&lt;%= yield %&gt;,但这也没有用
  • 日志是怎么说的?
  • @vee Started GET "/administrators/145a435c-6632-4d54-aca3-5e834b9e2d41/manage_accounts" for 127.0.0.1 at 2015-03-31 23:15:15 -0400 Processing by AdministratorsController#manage_accounts as HTML Parameters: {"id"=&gt;"145a435c-6632-4d54-aca3-5e834b9e2d41"} -- 然后它加载了 15 个用户帐户 -- 然后它说 Rendered administrators/_manage_accounts.html.erb (77.2ms)
  • 没有任何错误

标签: ruby-on-rails render yield actionview content-for


【解决方案1】:

为什么要将局部渲染作为操作的视图?

def manage_accounts
  @accounts = Account.order('id').page(params[:page]).per(15)
  render partial: 'manage_accounts'
end

像这样调用render partial只会渲染部分内容,不会加载布局。如果您想要布局(听起来确实如此),请将此文件重命名为普通视图 app/views/administrators/manage_accounts.html.erb,然后从您的操作中完全删除 render 调用。

我还建议将这些manage 路由中的每一个拆分到它们自己的控制器中,这样您就可以使用app/views/admin/accounts/index.html.erb,这将成为管理帐户的新视图。我建议这样做是因为它符合更传统的 Rails 应用程序的 CRUD 设计。

【讨论】:

  • 完美!我不知道该怎么感谢你才足够。照你说的做了并重命名了文件(没有下划线前缀)。然后从管理方法中删除“部分:”这个词,然后就可以了!一切都很好。至于其他建议,我这样做,但我的用户也可以访问这些控制器(帐户等)中的方法,并且这些“管理”方法仅限于管理员。所以我试图做的是将方法抽象到这个管理员控制器中。整个控制器(以及其中的所有内容)都需要经过授权。再次感谢 - 你是超人!
  • @B.Bulpett 与其拥有Administrators 控制器,不如将这些操作移动到管理命名空间中。我在这里有一个指南:github.com/radar/guides/blob/master/admin-namespace.md。我认为如果您将操作保留在一个控制器中,该控制器将承担太多责任并变得难以管理。通过将其拆分为多个控制器,您将使整个事情更易于管理。
  • 谢谢!如果让我重来一遍,我肯定会采用这种方法。我在这个兔子洞里有点太远了。感谢您的宝贵建议!
猜你喜欢
  • 2013-02-26
  • 2014-07-17
  • 2015-11-07
  • 2021-06-06
  • 1970-01-01
  • 2011-08-20
  • 2015-05-07
  • 2011-12-02
  • 2014-07-19
相关资源
最近更新 更多