2017-04-12 9 views
0

Ruby on Railsで新しいものがあり、前回と全く同じようにブロックされています。私はUserテーブル、Courseテーブル、Markテーブルを持っています。 私は、user_id、course_id、および成績でマークを作成できます。私のモデルでデータがデータベースに存在するかどうかを確認してください。

は私が持っている:私は私のフォームで、新しいマークを作成したとき

/* Mark model */ 
class Mark < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :course 
end 

/* Course model */ 
class Course < ActiveRecord::Base 
    has_many :marks 
end 

/* User model */ 
class User < ActiveRecord::Base 
    has_many :marks 
end 

だから私がやりたいことは、私は自分のフォームが消えると、ボタンが破棄表示されることをしたいです!このように:

<% if @mark.course_ids.include?(@course.id) and @mark.user_ids.include?(user.id) 
    # Button destroy 
<% else %> 
    <%= form_for Mark.new do |f| %> 
     <%= hidden_field_tag :course_id, @course.id %> 
     <%= hidden_field_tag :user_id, user.id %> 
     Grade: <%= number_field_tag :grade, nil, min: 0, max: 100 %> 
     <%= f.submit %> 
    <% end %> 
<% end %> 

目標は、しかし、ここで明らかにmark.course_idsとする@ mark.user_ids @ ..マークが直前に追加されたときにフォームを避けるためですが存在しません!

ありがとうございました!

+0

_ - あなたは別の質問を参照しているの?もしそうなら、リンクを提供してください。 – Stefan

+0

はい、もう1つはこれでした:[here](https://stackoverflow.com/questions/43348313/rails-check-if-relationships-exist-in-database) –

+0

'@マーク'には 'course_id'と' user_id '。したがって、あなたは '@ mark.course_id == @ course.id && @ mark.user_id == user.id'と書くことができます。 –

答えて

0

belongs_to associationは、他のモデルと1対1の接続を設定します。その後、Railsは、あなたのモデルに(特に)特異なユーティリティメソッドを作成します。

たとえば、モデルの関連付けによれば、マークbelongs_toコースとユーザーです。 Railsは、あなたのマークのモデルで、次のユーティリティメソッドを作成します。

@mark.course 
@mark.user 

そう声明:

@mark.course_ids.include?(@course.id) and @mark.user_ids.include?(user.id) 

が正しくありません。これらのメソッドは、Markモデルには存在しません。

これを試してみてください:

コントローラ

@marks = Mark.where(course_id: params[:id]) 

マークは間違いなくコースでは、それに関連付けられていますので、これは中にそのチェックをする必要はありません(そのコースのすべてのマークを取得しますあなたの意見)。

ビュー

は各マークのためのフォームをレンダリング:_ "前回と同様の"

<% @marks.each do |mark| %> 
    <% unless mark.user.exists? %> 
    <%= form_for Mark.new do |f| %> 
     <%= hidden_field_tag :course_id, @course.id %> 
     <%= hidden_field_tag :user_id, user.id %> 
     Grade: #{number_field_tag :grade, nil, min: 0, max: 100}#{f.submit} 
    <% end %> 
    <% end %> 
<% end %> 
+0

お返事ありがとうございます!しかし、もし私が@ mark.courseをexempleに使用したいのであれば、私のコントローラーには何がありますか?実際にはこの '@mark = Mark.where(course_id:params [:id])'がありますが、これは配列です:/ –

+0

@ValentinFerey .whereは常にレコードのコレクションを返します。また、1つのコースに複数のマークを付けることができるので、コースのマークの配列が返されることは意味があります。それぞれをループしてフォームを表示する必要があります。更新された回答を確認してください。 – Aph

+0

WoooW!どうもありがとう !!もちろん私は唯一の解決策だったが、私は "Unless"タグについて知らなかった!これで私はすべての私の問題を解決することができます!どうもありがとう ! RORの前でなければ聞いたことはありません... –

1

まず、テーブルを再考することをお勧めします。おそらく多対多の関係を見てみましょう。あなたの質問について

は、あなたが特定のユーザーの特定のコースに所属するマークが存在するかどうかを知りたいので、あなたはこのようなものが必要になりますように、A場合

Mark.where(course_id: @course.id, user_id: current_user.id).any? 

これはtrueを返しますレコードがあります。

+0

これはうまくいくかもしれませんが、私のUser_idはcurrent_userではありません!これは、このコースのすべてのユーザーのIDです。それぞれの方法が必要です... –

関連する問題