Edited at

アプリケーション作成1

More than 1 year has passed since last update.


アプリケーション作成


  • 投稿一覧と投稿内容

  • 投稿削除

  • コメント機能

  • 検索機能


db/migrate/xxxx_create_posts.rb


mkdir app
cd app
---------------
db/migrate/xxxx_create_posts.rb
class CreatePosts < ActiveRecord::Migration[5.0]
def change
create_table :posts do |t|
t.text :message
+ t.string :image
t.integer :user_id
t.timestamps
end
end
end

投稿を行えるように画像ファイル名を保存するフィールドを追加した。

t.string :image


rails db:migrate:reset

rails db:migrate:resetを実行するとマイグレーションを再実行できる


app/views/postsnew.html.erb


<% content_for :title do %>
メッセージ作成
<% end %>

<%= render 'layouts/error_message', object: @post %>
<div class=
"row">
<div class="col-md-8 col-md-offset-2">
<h1>メッセージ作成</h1>
<form action="<%= posts_path %>" method="post" enctype="multipart/
form-data">
+ <div class="
form-group">
+ <label for="
Message">メッセージ</label>
+ <textarea class="
form-control" name="message" id="Message" rows="5" placeholder="Your Post"></textarea>
+ </div>
<div class="
form-group">
<label for="
ImageFile">画像ファイル</label>
<input type="
file" name="file" id="ImageFile">
</div>
<button type="
submit" class="btn btn-primary">送信</button>
<%= hidden_field_tag :authenticity_token, form_authenticity_token %>
</form>
</div>
</div>


メッセージ作成画面に投稿する画像ファイルを設定する箇所を追加します。


app/controllers/posts_controller.rb


class PostsController < ApplicationController
before_action :logged_in_user

def index
if params[:word].present?
@posts = Post.where("message like ?", "%#{params[:word]}%").order(created_at: :desc)
else
@posts = Post.all.order(created_at: :desc)
end
end

def show
@post = Post.find(params[:id])
end

def new
# necessary for validation error message
@post = Post.new
end

def create
@post = Post.new
@post.message = params[:message]
@post.user_id = current_user.id

if params[:file].present?
image_file = params[:file]
time = Time.now
name = time.to_s + image_file.original_filename

File.open("#{Rails.public_path}/images/#{name}", 'wb') { |f|
f.write(image_file.read)
}
@post.image = name
else
@post.image = "no image"
end

if @post.save
redirect_to posts_path
else
render 'new'
end
end

def destroy
@post = Post.find(params[:id])
@post.destroy

redirect_to posts_path
end
end


app/controllers/posts_controller.rbのcreateを変更。createアクションにアップロードされた画像ファイルをサーバーのimageフォルダに置く処理とデータベースにファイル名を登録する処理を追加します。


app/views/posts/index.html.erb


<% content_for :title do %>
投稿一覧
<% end %>

<div class="row">
<div class="col-md-8 col-md-offset-2 col-xs-10 col-xs-offset-1">

<div class="row">
<div class="col-xs-6">
<h2>投稿一覧</h2>
</
div>
<div class="col-xs-6">
<a href="<%= new_post_path %>" class="btn btn-primary btn-space-20 pull-right">新しい投稿</a>
</
div>
</div>

<% @posts.each do |post| %>
<div class="row well">


app/views/posts/index.html.erbのコードを変更。index.html.erbの

「div class="row well"」の部分が投稿の数分表示される。


app/views/posts/index.html.erb


<div class="row well">
<div class="col-xs-9">
<div class="media">
<div class="media-left">
<a href="#">
<img class="media-object img-circle" src="<%= "/images/#{post.user.image}" %>" width=64 height=64>
</a>
</
div>
<div class="media-body">
<h5 class="media-heading"><%= post.user.name %> <small><%= post.created_at %></small></h5>
<p><%= post.message %></
p>
</div>
</
div>
</div>
<div class="col-xs-3">
<a href="<%= post_path(:id => post.id)%>" class="btn btn-info btn-xs pull-right">表示</
a>

<% if post.user.name == current_user.name %>
<form action="<%= post_path(:id =>
post.id) %>" method="post">
<input name="
_method" type="hidden" value="DELETE">
<button type="
submit" class="btn btn-danger btn-xs pull-right">削除</button>
<%= hidden_field_tag :authenticity_token, form_authenticity_token %>
</form>
<% end %>

</div>
</div>
<% end %>

</div>
</div>


PostとUserはリレーションを持っているので、post.user.nameのような参照ができます。

ログインしたユーザーと投稿メッセージを作成したユーザーが同じ場合のみ削除ボタンが表示されるような処理。