我是新的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 :(得分:1)
首先,我建议你重新考虑你的表格,或者看看多对多的关系。
关于您的问题,您想知道是否存在属于特定用户的特定课程的标记,因此您需要以下内容:
Mark.where(course_id: @course.id, user_id: current_user.id).any?
如果存在这样的记录,则返回true。
答案 1 :(得分:0)
belongs_to关联与其他模型建立一对一连接。然后,Rails在模型中创建一个单一的实用方法(等等)。
例如,根据您的模型关联,标记 belongs_to 一个课程和一个用户。 Rails将在Mark模型中创建以下实用程序方法:
@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 %>