2017-06-06 8 views
0

http://guides.rubyonrails.org/getting_started.htmlのガイドから始めました。私は正常にそれを取得し、実行しています。これまでのところ私はいくつかの調整を行った(コントローラの命名など)。このチュートリアルでは、モデルの関係を更新する方法については触れていませんが、これは現在私が苦労している点です。Rails 5:編集ビューで更新の代わりに関連付けられたリレーショントリガーを作成

モデル/ game.rb

class Game < ApplicationRecord 
    has_many :achievements, dependent: :destroy 
    validates :title, presence: true, 
        length: { minimum: 5 } 
end 

モデル/ achievement.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 

だから私は自分の成果に転送しようとした

コントローラ/ 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 

しかしそこに、私は私の編集を呼び出すたびにそれはcreateイベントを発生させます。ビュー/実績/ edit.html.erbで

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) 

マイ含まフォーム_form.html.erbは、次のようになります。私のedit.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 %> 

、私は正しい実績情報を取得し、なぜフィールドがあらかじめ充填されていないのかわかりません。送信ボタンのテキストは、毎回あなたのルートが同じような外観を提出ん&よろしく、 mybecks

答えて

0

edit.html.erb

<h1>Edit Achievement: <%= @achievement.title %></h1> 

<%= render 'form' %> 

<%= link_to 'Back', game_achievements_path(@game) %> 

感謝を "達成を作成" とは?あなたはこのような何かを行うことができるかもしれません:あなたの更新方法レールに基づき

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

特定のゲームに関連した成果を見つけることができるはずです。私は100%確信していませんが、これがあなたのために働くかどうか私に教えてください。 編集: あなたは、おそらくこのようにルートで何かを行うことができます:

resources :games do 
    resources :achievements 
end 
+0

私の 'routes.rb'ファイルは正確にあなたのように見えます。私もあなたのform_forの変種を試しましたが、それを使って、私は 'ゲーム'を作ることができません...そして、私が既存の成果でそれを実行すると、編集画面は変わりませんでした。 – mybecks

+0

@mybecks私はあなたの質問を誤解しているかもしれないと思います。 "@ game.achievements.build"を使用すると、ゲームにリンクされた新しいアチーブメントが作成されます。 "<%form_for([@game、@achievement])do | f |%>"のような形式を試すことができます。あなたが遭遇しているものと同様の問題を抱えていた人がいたところで、この答えをチェックしてください:https://stackoverflow.com/questions/2034700/form-for-with-nested-resources –

+0

そのリンクを作成してくれてありがとう。私は最終的にそれが働いて、ラインはトリックを行った。 '<%= form_for([@ゲーム、@achievement || = @ game.achievements.build])do | f | %> ' – mybecks

関連する問題