【问题标题】:How to add a record如何添加记录
【发布时间】:2015-06-02 02:18:14
【问题描述】:

我正在研究 Ruby on Rails,发现了一个我无法解决的问题。

说明: 我有一张票和评论。一张 Ticket 应该有很多 cmets。属于票证的所有 cmets 应在票证的“显示”视图中列出。还有一个文本字段和一个“添加新评论”按钮。添加评论后,应呈现当前工单的“显示”视图。

问题: 如何将当前工单的 id 发送到 Comments 模型以保存评论以及如何从 Comment 的方法“create”中呈现(或重定向?)工单的视图“显示”?

我的文件:

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 %>

【问题讨论】:

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


    【解决方案1】:

    您可以将工单 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]
    

    【讨论】:

      【解决方案2】:

      如果表单显示在您的票证视图中,您可以传入票证参数并直接从表单构建评论。在控制器中,您可以通过 :ticket_id 设置票证,而不是通过查找票证 :id 来设置票证,这样 Rails 就不会混淆了。

      在票展上:

      <%= form_for([@ticket, @ticket.comments.build]) do |f| %>
          <%= f.text_field :text %>
          <%= f.submit 'Add Comment' %>
      <% end %>
      

      在 cmets 控制器中:

      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 
      

      【讨论】:

        【解决方案3】:

        我希望您在您的 routes.rb 中使用嵌套资源,即:

        资源:门票做

        资源:cmets

        结束

        在您的控制器创建操作中,您所要做的就是稍微更新您的创建操作。 来自

        @comment.ticket_id = @current_ticket_id

        @ticket = Ticket.find(params[:ticket_id])

        @comment.ticket = @ticket

        确保您的参数接受 tickects 属性,即更新

        这个

        params.require(:comment).permit(:text)

        到这里

        params.require(:comment).permit(:text, ticket_attributes: [:tickect_id])

        希望有帮助

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-02
          • 1970-01-01
          • 1970-01-01
          • 2019-01-02
          • 2015-08-17
          • 1970-01-01
          相关资源
          最近更新 更多