【发布时间】:2017-06-06 14:41:12
【问题描述】:
我从http://guides.rubyonrails.org/getting_started.html 上的指南开始。我成功地启动并运行它。到目前为止,我做了一些调整(比如控制器的命名等)。本教程没有介绍如何更新模型的关系,这是我目前正在努力的重点。
models/game.rb
class Game < ApplicationRecord
has_many :achievements, dependent: :destroy
validates :title, presence: true,
length: { minimum: 5 }
end
模型/成就.rb
class Achievement < ApplicationRecord
belongs_to :game
end
我的游戏的更新,像魅力一样工作。
控制器/game_controller.rb
def edit
@game = Game.find(params[:id])
end
def update
@game = Game.find(params[:id])
if @game.update(game_params)
redirect_to @game
else
render 'edit'
end
end
private
def game_params
params.require(:game).permit(:title, :total_gs_points)
end
所以我尝试将其转移到我的成就中
controller/achievements_controller.rb
def edit
@game = Game.find(params[:game_id])
@achievement = @game.achievements.find(params[:id])
end
def update
@game = Game.find(params[:game_id])
@achievement = @game.achievements.find(params[:id])
# @achievement = Achievement.find(params[:id])
if @achievement.update(achievement_params)
redirect_to game_achievements_path(@game)
else
render 'edit'
end
end
private
def achievement_params
params.require(:achievement).permit(:id, :title, :description, :status, :hint, :pinned, :gs_points)
end
但是,每次我调用我的编辑路由时,它都会触发一个创建事件。
Started GET "/games/1/achievements/3/edit" for 127.0.0.1 at 2017-06-06 15:57:45 +0200
Processing by AchievementsController#edit as HTML
Parameters: {"game_id"=>"1", "id"=>"3"}
Game Load (0.3ms) SELECT `games`.* FROM `games` WHERE `games`.`id` = 1 LIMIT 1
Achievement Load (0.3ms) SELECT `achievements`.* FROM `achievements` WHERE `achievements`.`game_id` = 1 AND `achievements`.`id` = 3 LIMIT 1
Rendering achievements/edit.html.erb within layouts/application
Rendered achievements/_form.html.erb (3.2ms) [cache miss]
Rendered achievements/edit.html.erb within layouts/application (8.2ms)
Completed 200 OK in 28ms (Views: 23.9ms | ActiveRecord: 0.6ms)
我在views/achievements/edit.html.erb 中包含的表单_form.html.erb 看起来像:
<%= form_for([@game, @game.achievements.build]) do |f| %>
<p>
<%= f.label :title %><br>
<%= f.text_field :title %>
</p>
<p>
<%= f.label :description %><br>
<%= f.text_field :description %>
</p>
<p>
<%= f.label :status %><br>
<%= f.select :status, options_for_select([ 'open', 'claimed' ], 'open') %>
</p>
<p>
<%= f.label :hint %><br>
<%= f.text_area :hint %>
</p>
<p>
<%= f.label :pinned %><br>
<%= f.check_box :hint %>
</p>
<p>
<%= f.label :gs_points %><br>
<%= f.select :gs_points, options_for_select([ 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100 ], 50) %>
</p>
<p>
<%= f.submit %>
</p>
<% end %>
在我的 edit.html.erb 上,我得到了正确的成就信息,但不知道为什么这些字段没有被预填。提交按钮文本每次都是“创建成就”
edit.html.erb
<h1>Edit Achievement: <%= @achievement.title %></h1>
<%= render 'form' %>
<%= link_to 'Back', game_achievements_path(@game) %>
感谢和问候, 我的贝克
【问题讨论】:
标签: rails-activerecord ruby-on-rails-5 belongs-to