如何在考虑rails3的数据库设计的情况下设置动作

时间:2012-07-10 01:14:47

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

假设您将名为“Topic”的模型作为父级,将“Comment”作为子级。 在网址'topics / show / 35'上,您可以看到属于此主题ID#35的所有评论。

登录用户想要在此页面发布新评论时, 我应该在topics_controller.rb中写'comment_create'动作吗? 或者只是在comments_controller.rb中编写'create'动作,并从这个页面调用它? 哪一个是常规方式?

如果我在comments_controller中调用'create'动作,我如何在视图中写入传递

  1. '模型名称'将评论添加到
  2. '型号ID#'
  3. '评论正文'
  4. 或者我应该像这样单独编写动作?

    控制器/ comments_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
    

    示例已更新!!!

    视图/主题/ 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
    

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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

让我知道它是否对你有所帮助!联邦快递