我正在研究Ruby on Rails,发现了一个我无法解决的问题。
描述: 我有一张票和评论。一张票应该有很多评论。所有属于机票的评论都应列在故障单" show"视图。还有一个文本字段和一个按钮"添加新评论"。添加评论后应该呈现视图"显示"目前的票。
问题: 如何将当前票证的ID发送到评论模型以保存评论以及如何渲染(或重定向?)视图"显示"来自评论方法的票证"创建"?
我的档案:
class Ticket < ActiveRecord::Base
has_many :comments
end
class Comment < ActiveRecord::Base
belongs_to :ticket
end
class TicketsController < ApplicationController
def show
@ticket = Ticket.find(params[:id])
@comment = Comment.new
end
......
class CommentsController < ApplicationController
def create
@comment = Comment.new(params.require(:comment).permit(:text))
**@comment.ticket_id = @current_ticket_id** #The problem is here
@comment.save
**redirect_to ticket_path(params[:id])** #and here
end
<h1>Ticket details</h1>
<%= @ticket.number %></br>
<%= @ticket.title %></br>
<%= @ticket.text %></br>
<h3>Comments:</h3>
<%= form_for(@comment) do |f| %>
<%= f.label "Your comment:" %>
<%= f.text_field :text %>
<%= f.submit %>
<% end %>
</br>
<% @ticket.comments.all.each do |comment| %>
<p><%= comment %></p>
<% end %>
答案 0 :(得分:0)
您可以将票证ID作为表单中的隐藏字段传递,如下所示:
<%= form_for(@comment) do |f| %>
<%= f.label "Your comment:" %>
<%= f.text_field :text %>
<%= f.hidden_field :ticket_id, value: @ticket.id %>
<%= f.submit %>
<% end %>
然后从控制器访问它,如下所示:
@comment.ticket_id = params[:ticket_id]
答案 1 :(得分:0)
如果表单显示在故障单显示视图中,您可以传递故障单参数并直接从表单构建注释。在控制器中,您可以通过:ticket_id设置故障单,而不是通过查找故障单:id,因此rails不会感到困惑。
在演出门票上:
<%= form_for([@ticket, @ticket.comments.build]) do |f| %>
<%= f.text_field :text %>
<%= f.submit 'Add Comment' %>
<% end %>
在评论控制器中:
def create
@ticket = Ticket.find(params[:ticket_id])
@comment = Comment.create(comment_params)
@comment.ticket_id = @ticket.id
if @comment.save
flash[:success] = 'Comment Posted'
redirect_to :back
else
@comment.errors.each do |attr, msg|
flash[:warning] = msg
end
end
答案 2 :(得分:0)
我希望您在routes.rb中使用嵌套资源:
资源:门票
资源:评论
端
在你的控制器创建动作中你所要做的就是稍微更新你的创建动作。 从
@ comment.ticket_id = @current_ticket_id
到
@ticket = Ticket.find(params [:ticket_id])
@ comment.ticket = @ticket
确保你的params接受了tickects属性,即更新
这个
params.require(:comment).permit(:text)
到这个
params.require(:comment).permit(:text,ticket_attributes: [:tickect_id])
希望有所帮助