如何添加记录

时间:2015-03-28 21:42:23

标签: ruby-on-rails model-view-controller params

我正在研究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 %>

3 个答案:

答案 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])

希望有所帮助