【问题标题】:Ruby On Rails - Access the current_user attributes in JQueryRuby On Rails - 访问 JQuery 中的 current_user 属性
【发布时间】:2020-04-02 17:45:43
【问题描述】:

我制作了一份餐厅指南,并且正在实施星级评分系统。到目前为止一切都很好,但现在我在 JQuery 部分遇到了困难,该部分包含当前用户为餐厅投票的星数。 下面是相关代码:

SCHEMA --------------

  create_table "ratings", force: :cascade do |t|
    t.integer "star"
    t.integer "restaurant_id"
    t.integer "user_id"
  end

型号 --------------

餐厅型号:

class Restaurant < ApplicationRecord
   has_many :ratings
end

评级模型:

   class Rating < ApplicationRecord
      belongs_to :restaurant
      belongs_to :user
    end

用户模型:

class User < ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
  has_many :ratings
end

控制器 --------------------

评分控制器

class RatingsController < ApplicationController
  def create
    @restaurant = Restaurant.find(params[:restaurant_id])
    @rating = @restaurant.ratings.create(params[:rating].permit(:star))
    @rating.user = current_user
    @rating.save
    flash[:notice] = 'Obrigado pelo seu voto!'
    redirect_to restaurant_path(@restaurant)
  end
end

HTML ---------------

<ul class="rating pl-0">
  <% form_id = "restaurant_#{@restaurant.id}_rating"  %>
  <%= form_for([@restaurant, @restaurant.ratings.build], :html => {:id => "restaurant_#{@restaurant.id}_rating", :class => "star_rating_form"}) do |f| %>
    <%= f.hidden_field :restaurant_id %>
    <%= f.hidden_field :star, :id => "#{form_id}_stars" %>
  <% end %>
  <% (1..5).each do |i| %>
    <li class="rating_star mx-1 pb-4 pt-1" data-stars="<%= i %>" data-form-id="<%= form_id %>" id="<%= "#{form_id}_#{i}" %>"></li>
  <% end %>
</ul>

JQUERY ---------------

var set_stars = function(form_id, stars){
    for(i=1; i<=5; i++){
      if(i <= stars){
        $('#' + form_id + '_' + i).addClass('on');
      } else {
        $('#' + form_id + '_' + i).removeClass('on');
      }
    }
  }

  $(function() {
    $('.rating_star').click(function() {
      var star = $(this);
      var form_id = $(this).attr('data-form-id');
      var stars = $(this).attr('data-stars');

      set_stars(form_id, stars);

      $('#' + form_id + '_stars').val(stars);

      $.ajax({
        type: "post",
        url: $('#' + form_id).attr('action'),
        data: $('#' + form_id).serialize()
      });
  });

  <% if user_signed_in? %>
    $('.star_rating_form').each(function(){
      var form_id = $(this).attr('id');
      var stars = <%= @restaurant.ratings.current_user ---- HERE'S THE PROBLEM ---- %>
      set_stars(form_id, stars)
    });
  <% end %>

在 JQuery 代码的最后一部分(这里的问题)中,我需要访问 current_user 投票的星数(如果存在)。我尝试了很多东西,如果我输入 或 只是为了看看它是否是别的东西,代码就可以工作。我需要访问类似 @restaurant.ratings.stars.current_user

【问题讨论】:

    标签: jquery ruby-on-rails


    【解决方案1】:

    在我问了这个问题几分钟后,我发现了一个非常简单的方法,叫做.find_by(),我设法解决了这个问题。

    下面是相关代码:

    HTML ---------------

    <%= form_for([@restaurant, @restaurant.ratings.find_by(user: current_user) || @restaurant.ratings.build], :html => {:id => "restaurant_#{@restaurant.id}_rating", :class => "star_rating_form"}) do |f| %>
    

    JQUERY --------------

      <% if user_signed_in? %>
        $('.star_rating_form').each(function(){
          var form_id = $(this).attr('id');
          var stars = $('#' + form_id + '_stars').val();
          set_stars(form_id, stars)
        });
      <% end %>
    

    希望这可以帮助某人。 :)

    【讨论】:

    • 你也可以在你的控制器中完成@rating = @restaurant.ratings.find_or_initialize_by(user: current_user)(你应该这样做),然后在你的表单中使用@rating
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    相关资源
    最近更新 更多