【问题标题】:How to setup the actions with considering database design of rails3如何通过考虑 rails3 的数据库设计来设置操作
【发布时间】:2012-07-11 14:25:36
【问题描述】:

假设您有一个名为“Topic”的模型作为父模型,而“Comment”模型作为子模型。 在 url 'topics/show/35' 上,您可以看到属于该主题 ID#35 的所有 cmets。

当登录用户想在这个页面发表他的新评论时, 我应该在topics_controller.rb 中写'comment_create' 动作吗? 或者只是在 cmets_controller.rb 中编写“创建”操作,然后从此页面调用它? 哪个是常规方式??

如果我在 cmets_controller 中调用 'create' 操作,我该如何在视图中写入以通过

  1. 要添加 cmets 的“型号名称”
  2. '型号 ID#'
  3. '评论正文'

还是应该像这样单独编写动作?

控制器/cmets_controller.rb

  def create_in_topic
   code here! to add new comment record that belongs to topic....
  end


  def create_in_user
   code here! to add new comment record that belongs to user....
  end

供您参考,评论添加操作应该是这样的。

  def create

   @topic = Topic.find(params[:topics][:id] )
   @user_who_commented = current_user 
   @comment = Comment.build_from( @topic, @user_who_commented.id, params[:topics][:body] )
   @comment.save
   redirect_to :back   
   flash[:notice] = "comment added!"

  end

示例已更新!!!

views/topics/show.html.erb

<table>
  <tr>
    <th>ID</th>
    <th>Title</th>
    <th>Body</th>
    <th>Subject</th>
    <th>Posted by</th>
    <th>Delete</th>
  </tr>

<% @topic.comment_threads.each do |comment| %>
  <tr>
    <td><%= comment.id %></td>
    <td><%= comment.title %></td>
    <td><%= comment.body %></td>
    <td><%= comment.subject %></td>
    <td><%= comment.user.user_profile.nickname if comment.user.user_profile %></td>
    <td> **Comment destroy method needed here!!!** </td>
    </tr>
<% end %>
</table>

<%=form_for :topics, url: url_for( :controller => :topics, :action => :add_comment ) do |f| %>

    <div class="field">
      <%= f.label :'comment' %><br />
      <%= f.text_field :body %>
    </div> 

    <%= f.hidden_field :id, :value => @topic.id %>

  <div class="actions">
    <%= f.submit %>

<% end %>

控制器/topics_controller.rb

  def add_comment
   @topic = Topic.find(params[:topics][:id] )
   @user_who_commented = current_user
   @comment = Comment.build_from( @topic, @user_who_commented.id, params[:topics][:body] )
   @comment.save
   redirect_to :back
   flash[:notice] = "comment added!"
  end

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 database-design


    【解决方案1】:

    我认为最直接的实现将是您的主题控制器中的一个操作(即:add_comment)。视图调用 TopicController#add_comment 操作后,您将获得所有主题信息以及评论数据,因此您可以轻松地从那里将评论添加到主题。

    如果您需要进一步的帮助,请告诉我。 联邦快递

    【讨论】:

    • 谢谢!!!如果您从 /topics/show/35 页面中一一删除已发布的评论会怎样。我的意思是就像在这个 stackoverflow 的 cmets 上一样。您是否将“comment_destroy 方法”放入 topic_controller.rb 中?还是您需要调用“销毁方法”并将参数传递给 cmets_controller?通常哪种方式?
    • 不用担心,最简单的方法就是使用您已经存在的 _destroy 方法,当您显示关联的 cmets 并希望允许用户删除它们时,可以在视图中说,您可以简单地添加一些东西像这样:
    • 谢谢!我刚刚将我的代码添加到我的问题中。请看示例部分。请问如何修改这个实现checkbox删除多条记录的方法和增加cmets方法??
    • 等等你的观点有问题,你为什么有那个@ all_cmets?您应该从 @topic 获取主题的 cmets(如 @topic.cmets )
    • 检查我在另一个问题中的答案,这对你来说是一样的,但是按主题更改事件类别和按评论更改人员,这正是你所需要的! link
    【解决方案2】:

    嗯,我不确定,因为那个宝石,但你可以尝试这样的事情:

    <%=form_for @topic, url: url_for( :controller => :topics, :action => :add_comment ) do |f| %>
        <table>
            <tr>
                <th>ID</th>
                <th>Title</th>
                <th>Body</th>
                <th>Subject</th>
                <th>Posted by</th>
                <th>Delete</th>
            </tr>
    
        <% @topic.comment_threads.each do |comment| %>
            <%= f.fields_for :comment_threads, comment do |comment_form| %>
                <tr>
                    <td><%= comment.id %></td>
                    <td><%= comment.title %></td>
                    <td><%= comment.body %></td>
                    <td><%= comment.subject %></td>
                    <td><%= comment.user.user_profile.nickname if comment.user.user_profile %></td>
                    <td>Delete? <%= comment_form.check_box :_destroy %></td>
                </tr>
            <% end %>
        <% end %>
        </table>
    
    
        <div class="field">
            <%= f.label :'comment' %><br />
            <%= f.text_field :body %>
        </div> 
    
        <%= f.hidden_field :id, :value => @topic.id %>
    
        <div class="actions">
            <%= f.submit %>
        </div>
    <% end %>
    

    如果对你有帮助,请告诉我!联邦快递

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-20
      • 2014-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      相关资源
      最近更新 更多