Rails 4 content_for 并且 yield 显示空白页
Rails 4 content_for and yield displays blank page
我正在尝试渲染以下部分内容:
<% 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 的原因是当我在导航中单击 link 时,我有几个与上述部分类似的其他页面我想呈现:
<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>
以上link在controller中调用了各自的方法,如下:
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
但是当你点击导航中的 links 时,它只会显示一个空白页面,根本没有 html。控制台显示对象已根据控制器加载,并且正在渲染部分。 但是它在哪里呢?
我已经尝试了各种方法来让它工作。我得到的最接近的实际上是 没有 和 content_for/yield 并且只是调用该方法,这当然呈现部分就像它是它自己的页面一样(坏)。曾经有一个叫做 replace_html 的东西,它可能适用于我正在尝试做的事情,但我正在使用 Rails 4.1.8。
最初,我使用 AJAX 设置此导航,但它在这里不起作用。这些部分有 links 用于 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,但我只看到一个空白页面。我试过使用路径助手,但它会引发 "Missing Template" 错误。已经尝试了很多其他的东西,而不是 action 方法,但我仍然得到相同的结果。
为什么要将部分渲染为您的操作视图?
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 设计。
我正在尝试渲染以下部分内容:
<% 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 的原因是当我在导航中单击 link 时,我有几个与上述部分类似的其他页面我想呈现:
<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>
以上link在controller中调用了各自的方法,如下:
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
但是当你点击导航中的 links 时,它只会显示一个空白页面,根本没有 html。控制台显示对象已根据控制器加载,并且正在渲染部分。 但是它在哪里呢?
我已经尝试了各种方法来让它工作。我得到的最接近的实际上是 没有 和 content_for/yield 并且只是调用该方法,这当然呈现部分就像它是它自己的页面一样(坏)。曾经有一个叫做 replace_html 的东西,它可能适用于我正在尝试做的事情,但我正在使用 Rails 4.1.8。
最初,我使用 AJAX 设置此导航,但它在这里不起作用。这些部分有 links 用于 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,但我只看到一个空白页面。我试过使用路径助手,但它会引发 "Missing Template" 错误。已经尝试了很多其他的东西,而不是 action 方法,但我仍然得到相同的结果。
为什么要将部分渲染为您的操作视图?
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 设计。