つぶやきアプリを作ってみよう⑦

次はつぶやき詳細ページを作っていきましょう。

showアクションのルーティングを設定します。

```rb:config/routes.rb
Rails.application.routes.draw do
  root to: 'tweets#index'
  resources :tweets, only: [:index, :new, :create, :destroy, :edit, :update, :show]
end
```

７つのアクションが揃ったのでonlyオプションは必要なくなるのでまとめます。

```rb:config/routes.rb
Rails.application.routes.draw do
  root to: 'tweets#index'
  resources :tweets
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1008745/8494b018-dfee-ae28-0d95-d1ce88dd7884.png)

ルーティングが設定されました。

トップページのビューを編集しましょう。

```erb:app/views/tweets/index.html.erb
<div class="contents row">
  <% @tweets.each do |tweet| %>
    <div class="content_post" >
      <p><%= tweet.text %></p>
       <p><%= image_tag tweet.image.variant(resize: '500x500'), class: 'tweet-image' if tweet.image.attached?%></p>
      <span class="name">
        <%= tweet.name %>
      </span>
      <%= link_to '詳細', tweet_path(tweet.id), method: :get %>
      <%= link_to '編集', edit_tweet_path(tweet.id), method: :get %>
      <%= link_to '削除', "/tweets/#{tweet.id}", method: :delete %>
    </div>
  <% end %>
</div>
```

コントローラーにshowアクションを追記しましょう。

```rb:app/controllers/tweets_controller.rb
class TweetsController < ApplicationController

  def index
    @tweets = Tweet.all
  end

  def new
    @tweet = Tweet.new
  end

  def create
    Tweet.create(tweet_params)
  end

  def destroy
    tweet = Tweet.find(params[:id])
    tweet.destroy
  end

  def edit
    @tweet = Tweet.find(params[:id])
  end

  def update
    tweet = Tweet.find(params[:id])
    tweet.update(tweet_params)
  end

  def show
    @tweet = Tweet.find(params[:id])
  end

  private
  def tweet_params
    params.require(:tweet).permit(:name,:text,:image)
  end
end
```

詳細ページのビューを設定します。

```erb:app/views/tweets/show.html.erb
<div class="contents row">
    <div class="content_post" >
      <p><%= tweet.text %></p>
       <p><%= image_tag tweet.image.variant(resize: '500x500'), class: 'tweet-image' if tweet.image.attached?%></p>
      <span class="name">
        <%= tweet.name %>
      </span>
      <%= link_to '編集', edit_tweet_path(tweet.id), method: :get %>
      <%= link_to '削除', "/tweets/#{tweet.id}", method: :delete %>
    </div>
</div>
```

以下の挙動になっていれば成功です。



![neko5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1008745/36a580ec-6b1b-820a-b331-7d67b8e7d15d.gif)



以上で機能としては完成です。

しかしコントローラーの記述を見ると同じ記述が繰り返し使われています。
同じ処理を一つにまとめて、リファクタリングしましょう。

##before_action

コントローラで定義されたアクションが実行される前に、共通の処理を行うことができます。

```rb:
class コントローラ名 < ApplicationController
  before_action :処理させたいメソッド名
```

editアクションとshowアクションの記述が同じなので
set_tweetというアクションにまとめてbefore_actionに設定しましょう。

```rb:app/controllers/tweets_controller.rb
class TweetsController < ApplicationController
  before_action :set_tweet, only: [:edit, :show]

  def index
    @tweets = Tweet.all
  end

  def new
    @tweet = Tweet.new
  end

  def create
    Tweet.create(tweet_params)
  end

  def destroy
    tweet = Tweet.find(params[:id])
    tweet.destroy
  end

  def edit
  end

  def update
    tweet = Tweet.find(params[:id])
    tweet.update(tweet_params)
  end

  def show
  end

  private

  def tweet_params
    params.require(:tweet).permit(:name, :image, :text)
  end

  def set_tweet
    @tweet = Tweet.find(params[:id])
  end
end
```