ドグサレ初心者のへっぽこビッグウェーブ

地球の底辺にいるゴミがプログラミングとか音楽とかを語るクソブログ

自由に出入国できる国をつくりたい(Rails的な意味で)

まーた値の保存とルーティング関連がこんがらがってうまくリンクできなくなってたゾエ。

やりたい事としては

  1. anime_titles#showからanime_details#index、またはanime_details#newへ飛ばす
  2. anime_details#newでちゃんと内容を入力、保存できるようにする
  3. 保存後はanime_titles#showにリダイレクトさせる
  4. ついでにanime_details#indexにルート通して、ここからもanime_details#newが通れるようにする
  5. ちゃんとanime_details.anime_title_idが自動で入力されていること

anime_titles#showからanime_details#newへ飛ばす

見た目はともかく、link_toをきちんと通す。

[ anime_titles_controller.rb ]
特になし。

[ anime_titles/show.html.erb ]

<p>
  <strong>このアニメの情報を追加する</strong><br>
  <%= link_to('情報の追加', controller: :anime_details, action: :new, anime_title_id: @anime_title.id) %>
</p>
<p>
  <strong>このアニメの情報を表示</strong><br>
  <%= link_to('情報の表示', controller: :anime_details, action: :index, anime_title_id: @anime_title.id) %>
</p>

とりあえずこんな感じのlink_toの指定で飛べました。

↓飛び先

[ anime_details_controller.rb ]

  def new
    @anime_title = AnimeTitle.find(params[:anime_title_id])  # AnimeTitleのインスタンス、idを引き継ぐ
    @anime_detail = AnimeDetail.new
  end

newメソッドでは新しいインスタンス作りつつ、id引き継ぐインスタンス代入。

[ anime_details/new.html.erb ]
formに飛ばしてるので特になし。戻るボタンの戻り先を書き直すくらい。
ふと、「render」と「render partial:」の違いってなんなのだろう、と思って調べた。railsguides.jp
どうやらlayout:とかlocals:とかやるときにpartial:を明示する必要があるみたいです。


anime_details.anime_title_idが自動で入力されている & anime_details#newでちゃんと内容を入力、保存できる

以前も発生した、うまく外部キーを更新できない問題が発生して大変でした。ハァハァ

[ anime_details/_form.html.erb ]
#newの中で呼び出してるパーシャル。
外部キーを自動入力する方法がイマイチよくわからんかった。scaffoldで自動生成されたものをちょちょいといじって

  <div class="field">
    <%= f.label :anime_title_id %><br>
    <% @anime_detail.anime_title_id = @anime_title.id %>
  </div>

とやると、コントローラでcreateメソッド入ったときに、「@anime_detail.anime_title_idの値はnullですぽ」と言われる。
formから値取ってきてるからform消したらあかんのか?

  <div class="field">
    <%= f.label :anime_title_id %><br>
    <% @anime_detail.anime_title_id = @anime_title.id %>
    <%= f.number_field :anime_title_id %>
  </div>

としたら通った。とりあえずこれでいいかと思ったが、formなので値を書き換えられちゃうのが超イケてないのでなんとかしたい。
調べてみたらフォームを内容変更禁止にするオプションがあったので適用。

  <div class="field">
    <%= f.label :anime_title_id %><br>
    <% @anime_detail.anime_title_id = @anime_title.id %>
    <%= f.number_field :anime_title_id, :readonly => true %>
  </div>

表示自体隠せるのが一番いいんだけど、とりま今はこれで。


保存後はanime_titles#showにリダイレクトさせる

[ anime_details_controller.rb ]

  def create
    @anime_detail = AnimeDetail.new(anime_detail_params)

    respond_to do |format|
      if @anime_detail.save
        format.html { redirect_to controller: :anime_titles, action: :show, id: @anime_detail.anime_title_id, notice: 'Anime detail was successfully created.' }
      else
        format.html { render :new }
      end
    end
  end

createメソッドではformからの値をセーブしつつ、anime_titles#showへ戻す(値が入っているかの確認も兼ねて、@anime_detail.anime_title_idを参照してる)


ついでにanime_details#indexにルート通して、ここからもanime_details#newが通れるようにする

まぁリンク張るだけなんですけど。

<%= link_to 'New Anime detail', controller: :anime_details, action: :new, anime_title_id: @anime_title.id %>


うまくルートをつくるのはまだ大変です