うめぼしジョイスティック - ivoice

CakePHP、JavaScript、jQuery等のプログラミングについて書いていきます 思考は、うめぼしのように硬く、そして柔らかく。

Railsのあれこれ その1

エラーメッセージ

コントローラー

@post.errors.full_messages

でエラーメッセージを取得する。 この場合は

@post

というインスタンスに入ったエラーメッセージをすべて取得している。

これをビューで表示させるには

<% @post.errors.full_messages.each do |message| %>

 <%= message %>

<% end %>

とすればよい。 eachでループを回してすべてを表示させる。


フラッシュ

フラッシュのメッセージを表示させる。

コントローラーで

flash[:notice] = "入れたいメッセージ"

と書くと、フラッシュのメッセージが1回だけ表示できるようになる。

実際にビューで表示させるには

app>>views>>layouts>>application.html.erb

の中で

<header>
</header>

#ここを追加
    <% if flash[:notice] %>
      <div class="flash">
        <%= flash[:notice] %>
      </div>
    <% end %>
#ここまで追加

    <%= yield %>

とすればよい。


renderメソッドについて

renderメソッド。 別のアクションを経由せずに、直接ビューを表示するためのもの。

render("フォルダ名/ファイル名")

とすればよい。

投稿に失敗したときにもう一度投稿画面を表示するときなどに使う。

アクション内で定義していた@変数は、ビューで使うことが可能。

ルーティング(routes.rb)で

get "posts/:id/edit" => "posts#edit"

などのようにしていた場合でも

renderメソッドでは

render("posts/edit")

などのようにすればよく、id番号は必要ない。


記事の投稿

投稿をするばあいは get ではなく post を使う。

ルーティング(routes.rb)に

post "posts/create" => "posts#create"

を追加。 コントローラーにcreateアクションを追加する。

createアクションの中身は

  def create
    @post = Post.new(content: params[:text])
    if @post.save
      flash[:notice] = "投稿を作成しました"
      redirect_to("/posts/index")
    else
      render("posts/new")
    end
  end

のようにして、投稿に成功するとフラッシュメッセージを出すようにし、 投稿に失敗した場合はもう一度、newアクションに行くようにする。

newアクションは

  def new
    @post = Post.new
  end

とすればよい。

ビューは、createは必要ない。 new.html.erbというビューのファイルを作り、

     <%= form_tag("/posts/create") do %>
        <% @post.errors.full_messages.each do | message | %>
        <%= message %>
        <% end %>
        <textarea name="text"><%= @post.text %></textarea>
        <input type="submit" value="投稿">
    <% end %>

このようにすればよい。 エラーメッセージを表示させているのと、

 <textarea name="text"><%= @post.text %></textarea>

のようにして、textareaタグの中で、投稿が失敗した場合に投稿前のテキストが入るようにしてあるのがポイントである。


削除について

投稿の削除は

ルーティング(routes.rb)で

post "posts/:id/destroy" => "posts#destroy"

のようにする。

postであることに注意する。(destroyとupdate、createはpostである。createにはidは要らない。)

アクションは

  def destroy
    @post = Post.find_by(id: params[:id])
    @post.destroy
    flash[:notice] = "投稿を削除したよ"
    redirect_to("/posts/index")
  end

のようにすればよい。

リンクは

<%= link_to("削除", "/posts/#{@post.id}/destroy", {method: "post"}) %>

のようにリンクを貼る。

destroyのリンクでは

{method: "post"}

のようにして「postである」ということを明示する。 投稿フォームではないので、このような記述が必要になる。