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

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

ただいまの
回答率

90.32%

  • Ruby

    8219questions

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

  • Ruby on Rails

    7696questions

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

  • Ruby on Rails 4

    2465questions

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

  • Active Record

    251questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,087

Rubyliker

score 7

今現在、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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • s-show

    2017/04/17 19:25

    モデルのカラム構造も示して頂かないと、回答は難しいと思います。

    キャンセル

  • Rubyliker

    2017/04/17 21:15

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

    キャンセル

回答 1

checkベストアンサー

+1

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

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

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


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

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


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

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

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

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


とし、viewファイルに、

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


とします。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/18 00:18 編集

    ご回答ありがとうございます!
    「4.ユーザーは自由に他のユーザーが作成したグループに参加出来る」という部分ですが、上記の説明でとても分かり易かったのですが、
    今回の場合はjoin_controllerみたいなコントローラーを作成してユーザーをグループに追加する処理はする必要はないのでしょうか?

    join_controllerのcreateアクションでユーザーをグループの配列に追加するみたいな処理を想像しておりました。
    すみませんが、まだ初心者ですので、よろしくお願い致します。

    キャンセル

  • 2017/04/19 00:04

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

    キャンセル

  • 2017/04/19 15:55

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

    キャンセル

  • 2017/04/21 11: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

    よろしくお願いいたします。

    キャンセル

  • 2017/04/23 13:58

    > ユーザーが参加するグループと作成するグループを分けて下記のようにした方が良いのでしょうか?

    どのような処理を実現されたいのかが不明ですが、質問文に示されたテーブル構造を見る限り、

    @join_groups = User_groups.where(user_id: params[user_id])
    @created_groups = Groups.where(owner: params[user_id])

    みたいなコードでデータを取得してViewで使用すれば良さそうに思いますので、あえて分ける必要もないのでは?

    キャンセル

  • 2017/04/24 11:04

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

    キャンセル

同じタグがついた質問を見る

  • Ruby

    8219questions

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

  • Ruby on Rails

    7696questions

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

  • Ruby on Rails 4

    2465questions

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

  • Active Record

    251questions

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