初学者@Rails:未定义的方法`title'为nil:NilClass并且无法找到带有'id'的决定=编辑

时间:2015-10-20 09:56:40

标签: ruby-on-rails

对于您的上下文:这是我第一次尝试创建应用。我刚刚开始编码: - )。

我正在尝试使用简单的CRUD设置。

现在我有两个问题我无法理解:

  1. 我的条目未显示在索引页面上。它给出了以下错误:'未定义的方法`标题'为nil:NilClass'。该模型包含以下列: string:title,text:forecast,date:review_date

  2. 如果我去做决定/编辑它会给我以下错误:'无法找到带有'id'的决定=编辑'

  3. 这是我的代码:

    控制器:

      class DecisionsController < ApplicationController
    before_action :find_decision, only: [:show, :edit, :update]
    
      def index
    # gets all rows from decision table and puts it in @decision variable
        @decisions = Decision.all
      end
    
      def show
    # find only the decision entry that has the id defined in params[:id]
        @decision = Decision.find(params["id"])
      end
    # shows the form for creating a entry
      def new
        @decision = Decision.new
      end
    # creates the entry
      def create
        @decision = Decision.new(decision_params)
          if @decision.save
            redirect_to @decision
          else
            render 'new'
          end
      end
    # shows the form for editing a entry
      def edit
          @decision = Decision.find(params["id"])
      end
    # updates the entry
      def update
      end
    
      def destroy
      end
    
      private
      def find_decision
          @decision = Decision.find(params["id"])
      end
    
      def decision_params
        params.require(:decision).permit(:title, :forecast, :review_date)
      end
    
    end
    

    索引视图

    <h1>Hello World ^^</h1>
    
    <% @decisions.each do |descision| %>
     <p><%= @decision.title %></p>
    <% end %>
    

    的routes.rb

    Rails.application.routes.draw do
      resources :decisions
      root 'decisions#index'
    end
    

    我整个上午都在研究这两个,但我无法理解。如果你们有人可以帮我一下,我会帮助很大。

1 个答案:

答案 0 :(得分:2)

  

我刚刚开始编码

欢迎!!

  

我的entries没有显示在我的索引页面上。

我确定你的意思是decisions,对吧?

如果是这样,你必须记住,如果你在Ruby中调用循环,你需要一些条件逻辑来确定它是否真的填充了尝试调用它之前的任何数据:

#app/views/decisions/index.html.erb
<% if @decisions.any? %>
   <% @decisions.each do |decision| %>
      <%= content_tag :p, decision.title %>
   <% end %>
<% end %>

这必须与相应的控制器代码匹配:

#app/controllers/decisions_controller.rb
class DecisionsController < ApplicationController
    before_action :find_decision, only: [:show, :edit, :update, :destroy]

    def index
       @decisions = Decision.all
    end

    def show
    end

    def new
       @decision = Decision.new
    end

    def create
       @decision = Decision.new decision_params
       @decision.save ? redirect_to(@decision) : render('new')
    end

    def edit
    end

    def update
    end

    def destroy
    end

    private
    def find_decision
        @decision = Decision.find params["id"]
    end

    def decision_params
      params.require(:decision).permit(:title, :forecast, :review_date)
    end
end

这样,您就可以根据自己访问的路线在视图中调用@decisions@decision

重要的一点是,当你说......时,

  

decisions/edit它给了我以下错误:Couldn't find Decision with 'id'=edit'

......问题是由处理Rails routing的方式引起的:

enter image description here

因为Ruby / Rails是object orientated,所以每组路由都对应于集合对象或成员对象。这就是edit等路由需要&#34; id&#34;被传递 - 他们被设计为处理成员对象

因此,当您访问任何&#34;成员&#34;路由(decisions/:iddecisions/:id/edit),您必须提供id,以便Rails可以从数据库中提取相应的记录:

#app/views/decisions/index.html.erb
<% if @decisions.any? %>
   <% @decisions.each do |descision| %>
      <%= link_to "Edit #{decision.title}", decision_edit_path(decision) %>
   <% end %>
<% end %>

我可以解释更多 - 上面的内容现在应该适合你。