一个非常基本的RoR问题,我似乎无法在网上找到答案:
我有两个用脚手架创建的独立表。 午餐和评论。在脚手架期间没有建立关系。如果需要,我可以重做评论脚手架。
我需要能够接收并在午餐索引视图中向每个午餐显示相关评论。有人可以告诉我该怎么做吗?
我将models \ comment.rb编辑为:
class Comment < ActiveRecord::Base
belongs_to :lunch
end
我将models \ lunch.rb编辑为:
class Lunch < ActiveRecord::Base
has_many :comments, dependent: :destroy
end
在午餐视图中,我有一个列出所有午餐列的循环:
<tbody>
<% @lunches.each do |lunch| %>
<tr class="<%= cycle('list_line_odd', 'list_line_even')%>">
<td><%= lunch.company %></td>
<td><%= lunch.person %></td>
<td><%= lunch.email_submit_lunch %></td>
<td><%= lunch.company_contact %></td>
<td class="list_description"><%= truncate(strip_tags(lunch.description), length: 40) %></td>
<td><%= lunch.date %></td>
<td><%= lunch.price %></td>
<td class="list_actions"><%= link_to 'Show', lunch %></td>
<td class="list_actions"><%= link_to 'Edit', edit_lunch_path(lunch), data: { confirm: 'Are you sure?' } %></td>
<td class="list_actions"><%= link_to 'Destroy', lunch, method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
</tbody>
**编辑:我已重做评论表以包含lunch_id外键。如何将这个外键(lunch_id)从午餐视图传递到评论创建过程?
答案 0 :(得分:0)
您应该在午餐模型上使用评论关系。
如果你正确地建立了它,那么你可以尝试类似的东西:
<tbody>
<% @lunches.each do |lunch| %>
<tr class="<%= cycle('list_line_odd', 'list_line_even')%>">
<td><%= lunch.company %></td>
<td><%= lunch.person %></td>
<td><%= lunch.email_submit_lunch %></td>
<td><%= lunch.company_contact %></td>
<td class="list_description"><%= truncate(strip_tags(lunch.description), length: 40) %></td>
<td><%= lunch.date %></td>
<td><%= lunch.price %></td>
<td>
<%- lunch.comments.each do |comment| %>
<p><%= comment.body %></p>
<% end %>
</td>
<td class="list_actions"><%= link_to 'Show', lunch %></td>
<td class="list_actions"><%= link_to 'Edit', edit_lunch_path(lunch), data: { confirm: 'Are you sure?' } %></td>
<td class="list_actions"><%= link_to 'Destroy', lunch, method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
UPD:
class CommentsController < ApplicationController
def create
lunch = Lunch.find(params[:lunch_id])
lunch.comments.create!(comment_params)
end
private
def comment_params
params[:comment].permit(:body)
end
end
在这种情况下,当您发布表单以创建评论时,您应该添加lunch_id以形成参数,例如:
lunch_path(lunch_id:lunch.id)
这是主要的想法。但实现可能取决于您的业务逻辑。例如,您在哪里找到新的评论表和其他条件。
答案 1 :(得分:0)
您在说明中没有提到它,但是您需要将列lunch_id
添加到评论表(如果您还没有),以使关系正常工作。
通过定义Lunch
has_many :comments
Rails将为Lunch
创建一个名为comments
的实例方法,该方法将返回相关的注释。
在您的视图中,您可以执行以下操作来显示评论。
<tbody>
<% @lunches.each do |lunch| %>
<tr class="<%= cycle('list_line_odd', 'list_line_even')%>">
<td><%= lunch.company %></td>
<td><%= lunch.person %></td>
<td><%= lunch.email_submit_lunch %></td>
<td><%= lunch.company_contact %></td>
<td class="list_description"><%= truncate(strip_tags(lunch.description), length: 40) %></td>
<td><%= lunch.date %></td>
<td><%= lunch.price %></td>
<ul>
<% lunch.comments.each do |comment| %>
<li><%= comment %></li>
<% end %>
</ul>
<td class="list_actions"><%= link_to 'Show', lunch %></td>
<td class="list_actions"><%= link_to 'Edit', edit_lunch_path(lunch), data: { confirm: 'Are you sure?' } %></td>
<td class="list_actions"><%= link_to 'Destroy', lunch, method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
</tbody>
答案 2 :(得分:0)
您肯定需要在评论表中为午餐建立FK。调整迁移以包括:
create_table "comments" do |t|
t.string :body
t.integer :lunch_id
end
然后要显示评论,只需循环浏览索引视图中每个comments
上的lunch
:
<td>
<% lunch.comments.each do |comment| %>
<p><%= comment.body %></p>
<% end %>
</td>
答案 3 :(得分:0)
据我所知,您独立创建了两个模型支架。这意味着您的数据库表未连接。
要实际建立关联,您必须在评论表中添加一列&#34; lunch_id&#34; (这会告诉Rails评论所属的午餐)。
您可以通过运行
来完成此操作rails g migration AddLunchIdToComment
之后打开新创建的迁移文件并添加行
add_column, :comments, :lunch_id, :integer
更改功能内部。
之后执行rake db:migrate
现在,您可以在视图循环中使用lunch.comments
方法访问与午餐相关的评论。这应该使你的代码工作(不要忘记重启服务器)。