【问题标题】:Rails 5: Associated relation triggers create instead of update on edit viewRails 5:关联关系触发器在编辑视图上创建而不是更新
【发布时间】: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


    【解决方案1】:

    您的路线文件是什么样的?您也许可以这样做:

    <%= form_for @achievement do |f| %>
    < your form code >
    

    根据您的更新方法,Rails 应该能够找到与特定游戏相关的成就。不过,我不是 100% 确定,如果这对你有用,请告诉我。 编辑: 你可能可以在这样的路线中做一些事情:

    resources :games do
        resources  :achievements 
    end
    

    【讨论】:

    • 我的routes.rb 文件看起来和你的一模一样。我也尝试了你的 form_for 变体,但是这样,我无法创建“游戏”......如果我在现有成就上运行它,那么编辑屏幕不会改变。
    • @mybecks 我想我可能误解了你的问题。使用“@game.achievements.build”创建一个与游戏相关的新成就。您也许可以对表单尝试这样的操作:“”。在有人遇到与您遇到的问题类似的问题时查看此答案:stackoverflow.com/questions/2034700/…
    • 感谢您指出该链接。我终于让它工作了,下面的线就成功了。 &lt;%= form_for([@game, @achievement||= @game.achievements.build ]) do |f| %&gt;
    • @mybecks 没问题,我很高兴它有帮助!刚开始时学习 RoR 可能真的很烦人。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    相关资源
    最近更新 更多