【问题标题】:Add star ratings to my model rails3将星级评分添加到我的模型 rails3
【发布时间】:2012-06-07 17:41:30
【问题描述】:

我有一个名为 teacher 的模型,我想为它添加评分(5 星)。目前,我通过在我的教师资源中添加一个 ratings 嵌套路由(资源评级)来实现这一点。然后我创建了一个模型:使用 (id, user_id, teacher_id, rating, ...) 进行评分。然后我创建了一个带有隐藏字段的表单,其中一个名为stars。当用户点击星星时,我使用 jQuery 发送 AJAX 请求来创建/更新该用户和老师的评分。

我的困惑是:我在页面上有两个单独的表单。我有一个用于撰写审稿人 cmets 的表格。此表单有两个字段:标题、cmets(和提交)。然后我有带有隐藏字段的评级表。这是做这样的事情的正确方法吗?在我看来,我真的应该将评级模型字段以某种方式嵌入到主评论表单中。

高度赞赏任何帮助。谢谢。

[编辑]

我更新了我的应用程序,现在用户不再给 teacher 对象评分,而是对 teachercomment 进行评分

我的设置是这样的:

路线

resources :comments as :teacher_comments do  
 resource :rating  
end  

模型

评论

has_one :rating  
attr_accessible :body, :rating_attributes  
accepts_nested_attributes_for :rating  

评分

belongs_to :comment  
attr_accessible :stars, :user_id, :teacher_id, :comment_id  

查看

<%= form_for( @comment, :remote => true, :url => teacher_comments_path ) do |tc| %>
  <%= tc.text_area :body, :maxlength => 450  %>
  <%= tc.fields_for :rating do |builder| %>
    <%= builder.text_field :stars  %>
  <% end %>
<% end %>

我没有看到星星的文本字段。它只是没有出现。有什么我错过的吗?

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    确实,将所有这些字段放在一个表单中通常会更好(有利于用户体验)。

    编辑:

    您可以使用accepts_nested_attributes_for 方法(正如您在下面的 cmets 中建议的那样)。将以下内容放入您的父模型(老师)中;那么您应该能够创建一个表单来处理两个模型的输入:

    在模型中:

    class Comment < ActiveRecord::Base
      has_one :rating
      accepts_nested_attributes_for :rating
    end
    

    在控制器中:

    def new
      @comment = Comment.new
      @comment.rating = Rating.new
    end
    

    Ryan Bates 在此处提供了有关这些概念使用的详细截屏视频:Nested Model Form。我推荐给想要了解更多细节的用户。

    原文:

    这意味着您需要将表单指向一个可以处理这两种输入类型的操作。如果您愿意,您仍然可以使用form_for,但指定一个默认操作以外的操作(或更改您的teacher_controller.rb 文件中默认操作中的代码):

    <%= form_for @teacher, :url => {:action => 'create_and_rate'} do |f| %>
    

    由于 rating 是一个与 teacher(我们刚刚创建的表单)不同的模型,因此您需要对 rating 字段使用通用的 _tag 表单助手。

    <%= text_field_tag :rating, :name %> # rating's fields should use the generic form helper
    <%= f.text_field :name %> # teacher's fields can use the specific form helper
    

    由于您指向的是非 RESTful 操作,请将其添加到您的路由文件中。

    resources :teacher do
      :collection do
        post 'create_and_rate' # this will match /teachers/create_and_rate to TeachersController#create_and_rate
      end
    end
    

    【讨论】:

    • 非常感谢。这看起来是一种非常干净的方式。我一直在寻找,发现你也可以在父模型中使用:accepts_nested_attributes_for方法。我喜欢你的解决方案,因为它不那么神奇,但你知道在模型中使用这种方法是否是 rails 方式 吗?再次感谢您的帮助!
    • 很高兴有任何用处。我没有使用accepts_nested_attributes_for 方法的经验,所以我不能很好地评估它,但我想我将来会使用它(而不是我的解决方案)。看起来很棒。
    • 嘿,我已经稍微更新了我的模型。您可以在上面的编辑部分中看到。现在 accepts_nested_attributes_for 似乎不起作用!
    • 您做得很好,但如果您还没有在控制器中创建评级,则需要:@comment.rating = Rating.new(有什么不同?)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-16
    相关资源
    最近更新 更多