对于您的上下文:这是我第一次尝试创建应用。我刚刚开始编码: - )。
我正在尝试使用简单的CRUD设置。
现在我有两个问题我无法理解:
我的条目未显示在索引页面上。它给出了以下错误:'未定义的方法`标题'为nil:NilClass'。该模型包含以下列: string:title,text:forecast,date:review_date
如果我去做决定/编辑它会给我以下错误:'无法找到带有'id'的决定=编辑'
这是我的代码:
控制器:
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
我整个上午都在研究这两个,但我无法理解。如果你们有人可以帮我一下,我会帮助很大。
答案 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的方式引起的:
因为Ruby / Rails是object orientated,所以每组路由都对应于集合对象或成员对象。这就是edit
等路由需要&#34; id&#34;被传递 - 他们被设计为处理成员对象。
因此,当您访问任何&#34;成员&#34;路由(decisions/:id
,decisions/: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 %>
我可以解释更多 - 上面的内容现在应该适合你。