質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

Q&A

解決済

1回答

5546閲覧

Ruby on Railsの関連付けと実装処理について

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

0グッド

0クリップ

投稿2017/04/16 08:34

編集2017/04/17 12:16

今現在、Ruby on Railsの勉強でブログサイトを開発しております。
初心者なのですが、勉強のために少し応用的な「ユーザーと投稿のグループ機能」を実装中です。
そこで、「ユーザーと投稿のグループ機能」について質問なのですが、よろしくお願いいたします。

仕様は以下の通りです。
1.ユーザーは自由に投稿できる(多数の投稿を持つ)
2.投稿はユーザーに属する(1人のユーザーを持つ)
3.投稿は1つのグループに属する(1つのグループを持つ)
4.ユーザーは自由に自分でグループを作成できる(ユーザーは多数のグループを持つ)
5.ユーザーは自由に他のユーザーが作成したグループに参加できる(グループは多数のユーザーを持つ)
6.ユーザーは自分が参加しているグループの中から1つ選んで投稿できる
7.グループを作成したユーザーがそのグループの管理者になる

現在は自分で勉強し、以下の状態までコードを書いています。
しかし、
「4.ユーザーは自由に他のユーザーが作成したグループに参加できる」という部分の「ユーザーをグループに参加させる」という処理と
「5.ユーザーは自分が参加しているグループの中から1つ選んで投稿できる」という部分の「投稿を指定したグループに投稿する」という処理がどういう実装をしたら良いか分かりません。
アドバイスなどして頂けますと幸いです。
よろしくお願いいたします。

コード(コントローラ)

<users_controller.rb>
def index
@users = User.all
end

def show
@user = User.find(params[:id])
@posts = @user.posts.postable_for(current_user)
end

def new
@user = User.new
end

def edit
@user = User.find(params[:id])
end

def create
@user = User.new(user_params)
if @user.save
redirect_to :root, notice: "登録完了"
else
render :new
end
end

def update
if @user.update_attributes(user_params)
redirect_to @user, notice: "会員情報を更新しました。"
else
render :edit
end
end

def destroy
@user = User.find(params[:id])
@user.destroy
redirect_to :root, notice: "削除しました。"
end

private

def user_params params.require(:user).permit(:name, :email, :password, :password_confirmation) end

<posts_controller.rb>
def index
@posts = Post.all
end

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

def new
@post = Post.new
end

def edit
@post = current_user.posts.find(params[:id])
end

def create
@post = current_user.posts.new(post_params)
if @post.save
redirect_to @post, notice: "投稿しました"
else
render :new
end
end

def update
@post = current_user.posts.find(params[:id])
if @post.update_attributes(post_params)
redirect_to @post, notice: "投稿を編集しました。"
else
render :edit
end
end

def destroy
@post = current_user.posts.find(params[:id])
@post.destroy
redirect_to :root, notice: "投稿を削除しました。"
end

private

def post_params params.require(:post).permit(:title, :content) end

<groups_controller.rb>
def index
@groups = Group.all
end

def show
@group = Group.find(params[:id])
end

def new
@group = Group.new
end

def edit
end

def create
@group = Group.new(group_params)
@group.owner = current_user # グループを作成したユーザーがそのグループの管理者になる
if @group.save
redirect_to @group, notice: "グループを作成しました。"
else
render :new
end
end

def update
@group = Group.find(params[:id])
if @group.update_attributes(group_params)
redirect_to @group, notice: "グループを編集しました。"
else
render :edit
end
end

def destroy
@group = Group.find(params[:id])
@group.destroy
redirect_to :root, notice: "グループを削除しました。"
end

private
def post_params
params.require(:group).permit(:name)
end

コード(モデル)

<User.rb>
id
name
email

has_many :groups, through: :user_grourps
has_many :user_groups
has_many :posts

<Post.rb>
id
user_id
content
group_id

belong_to :user
belong_to :group

<Group.rb>
id
name
owner #グループを作成したユーザー
user_id

has_many :user_groups
has_many :users, through: :user_grourps
has_many :posts

<User_grourp.rb>(UserとGroupの中間テーブル)
user_id
post_id

belong_to :user
belong_to :group

アドバイスなどよろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

s-show

2017/04/17 10:25

モデルのカラム構造も示して頂かないと、回答は難しいと思います。
退会済みユーザー

退会済みユーザー

2017/04/17 12:15

ありがとうございます。カラムを追記いたしました。よろしくお願いいたします。
guest

回答1

0

ベストアンサー

「5.ユーザーは自分が参加しているグループの中から1つ選んで投稿できる」

という質問につきましては、「投稿画面に、contentを入力するテキストボックスと、自分が所属しているグループ名を選択するセレクトボックスがあり、ユーザーはその2つの項目を入力してから投稿ボタンを押す」というものを想像しているのですが、それであれば、collection_selectメソッドを使えば良いかと思います。
具体的には、post_controllernewアクションに

ruby

1 @groups = Group.where(user_id: current_user.id)

を追加してcollection_selectメソッドで使う変数を用意し、viewファイルで、

ruby

1 <% form_for(@post) do |f| %> 2 (投稿に必要なフォームの部品) 3 <%= f.collection_select(:group_id, @groups, :id, :name) 4 <%= f.submit '投稿' %> 5 <% end %>

とすれば、ユーザーが自分が参加しているグループを選んで投稿できるようになると思います。

「4.ユーザーは自由に他のユーザーが作成したグループに参加できる」

につきましては、私でしたらadd_user_to_groupというアクションを作成し、そこに

ruby

1 def add_user_to_group 2 @user = User.find(id: current_user.id) 3 @group = Group.new 4 end

とし、viewファイルに、

ruby

1 <% form_for(@group) do |f| %> 2 <%= f.hidden_field :user_id, :value => @user.id %> 3 <%= f.collection_select(:group_id, @groups, :id, :name) %> 4 <%= f.submit '参加' %> 5 <% end %>

とします。

投稿2017/04/17 13:49

編集2017/04/17 14:13
s-show

総合スコア203

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/04/17 16:01 編集

ご回答ありがとうございます! 「4.ユーザーは自由に他のユーザーが作成したグループに参加出来る」という部分ですが、上記の説明でとても分かり易かったのですが、 今回の場合はjoin_controllerみたいなコントローラーを作成してユーザーをグループに追加する処理はする必要はないのでしょうか? join_controllerのcreateアクションでユーザーをグループの配列に追加するみたいな処理を想像しておりました。 すみませんが、まだ初心者ですので、よろしくお願い致します。
s-show

2017/04/18 15:04

私なら、groups_controllerにアクションを追加しますが、特に明確な根拠に基づく判断ではなく、グループにユーザーを加えるのだからgroups_ controllerにアクションを追加する、という程度の判断です。 ただ、今後、グループからのユーザーの削除機能なんかも実装すると思いますし、この機能はgroups_controllerに実装すべきアクションになると思いますので、ユーザーの追加も同じcontrollerに実装しておくのが良いかと思います。
退会済みユーザー

退会済みユーザー

2017/04/19 06:55

ありがとうございました。 分かりやすい回答で勉強になりました! 是非、参考にさせていただきます!!
退会済みユーザー

退会済みユーザー

2017/04/21 02:36

さらにもう一つ質問があるのですが、リレーションに関してですが、 現在は、User.rbに下記のように書いております。 has_many :user_groups has_many :users, through: :user_grourps ユーザーが参加するグループと作成するグループを分けて下記のようにした方が良いのでしょうか? has_many :groups, through: :user_grourps #ユーザーが作成したグループ has_many :join_groups, class_name: "Group", through: :user_grourps #ユーザーが参加するグループ has_many :user_groups よろしくお願いいたします。
s-show

2017/04/23 04:58

> ユーザーが参加するグループと作成するグループを分けて下記のようにした方が良いのでしょうか? どのような処理を実現されたいのかが不明ですが、質問文に示されたテーブル構造を見る限り、 @join_groups = User_groups.where(user_id: params[user_id]) @created_groups = Groups.where(owner: params[user_id]) みたいなコードでデータを取得してViewで使用すれば良さそうに思いますので、あえて分ける必要もないのでは?
退会済みユーザー

退会済みユーザー

2017/04/24 02:04

ありがとうございます。確かにそうでした。とても勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問