2017-05-05 91 views
-1

我的页面控制器具有此代码:如何将链接添加到页面动态地在Rails中

class PagesController < ApplicationController 

    def index 
    @pages = Page.all 
    end 

    def new 
    @page = Page.new 
    end 

    def edit 
    @page = Page.find(params[:id]) 
    end 

    def create 
    @page = Page.new(page_params) 
    @page.save 
    redirect_to @page 
    end 

    def update 
    @page = Page.find(params[:id]) 
    @page.update(page_params) 
    redirect_to @page 
    end 

    def show 
    @page = Page.find(params[:id]) 
    end 

    def destroy 
    @page = Page.find(params[:id]) 
    @page.destroy 
    redirect_to pages_path 
    end 


    private 
    def page_params 
    params.require(:page).permit(:title,:description) 
    end 

end 

而在我的导航栏我有这样的代码:

<% @pages.each do |page| %> 
     <li?<%= link_to 'page.title', page_path(page)%></li> 
    <% end %> 

代码应生成每个标题页面创建,但是当我运行该页面时出现以下错误:

undefined method `each' for nil:NilClass 

我以为我通过enteri消除了此问题在PagesController中新函数内的代码。此页面控制器仅用于其他页面。导航栏还包含指向静态页面的链接,因此导航栏中应该总是有一些值。

有没有人有任何建议?

+0

它是否适用于'index',但不适用于'show'。或者,它无法工作? – jvillian

+0

它不在导航栏中工作。我有一个单独的页面,用户可以创建读取更新和销毁页面。此功能在那里工作,但不在导航栏中 – Sandra123

+0

当导航栏引发错误时,会调用什么控制器/操作? – jvillian

回答

0

试试这个:

application_controller.rb

@pages = Page.all 

,并在您导航栏添加此

<% @pages.each do |page| %> 
    <li><%= link_to "#{page.title}", page_path(page)%></li> 
<% end %> 
+0

谢谢!这炒锅。我没有将@pages = Page.all添加到application_controller.rb非常感谢你 – Sandra123

+0

这样做意味着每个Web请求都会将所有页面加载到内存中。正确的方法是将'@ pages'设置为需要'@ pages'填充的控制器中的before_filter(Rails 5中的before_action)。 – scarver2

+0

@ scarver2是的,但他需要在那里,因为他希望所有页面都可以在每个视图中出现的主导航栏中使用。我不知道他为什么需要它,但是,对于每个请求,将所有页面加载到内存中并不好。 – amrrbakry

-2

听起来您的Page表中没有任何页面。确保你已经用一些页面填充了这张表。

您也可以将代码包装在unless子句中,以检查@pages是否为零。

例如:

<% unless @pages.nil? %> 
    <% @pages.each do |page| %> 
     <li?<%= link_to 'page.title', page_path(page)%></li> 
    <% end %> 
<% end %> 
相关问题