Ruby on Rails --- sql запрос записей определенного пользователя c - PullRequest
0 голосов
/ 26 марта 2020

Я новичок в ruby на рельсах и буду признателен за любую помощь. Это приложение предназначено, чтобы помочь студентам получить результаты своего запроса sql. Так что я ожидаю ввода sql от студентов. Я пытаюсь "выбрать * из сообщений, где uid <4" для конкретного c Студента. То есть он может видеть только некоторые кортежи со своим student_id. И контроллер приложения выглядит следующим образом (где текущий пользователь - информация для входа в систему этого студента): </p>

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.



  protect_from_forgery with: :exception
  before_action :ensure_login
  helper_method :logged_in?, :current_user

  def index

  end



  protected
    def ensure_login
      # Always go to login page unless session contains
      # reviewer_id
      redirect_to login_path unless session[:student_id]
    end

    def logged_in?
      session[:student_id] # nil is false
    end

    def current_user
      @current_user ||= Student.find(session[:student_id])
    end


end

В соответствующем контроллере я написал что-то вроде этого, пытаясь найти только записи current_user, но это не удалось (он выдает все кортежи с uid <4 независимо от того, какой это student_id): </p>

def findit

    #render json: { success: "It works", operator: params[:operator].inspect,condition: params[:condition].inspect,table: params[:table].inspect}

    @results = current_user.posts.find_by_sql(params[:sql])
    render json: { html: render_to_string(:template => 'all/findit') }
    #render json: { c: @columns}

  end

Но работает следующий код в posts_controller.rb. У него есть только записи для этого конкретного c студента. Так что же не так с findit?

 def index
    @posts = current_user.posts.all
  end

Схема: (И есть модель сеанса тоже)

ActiveRecord::Schema.define(version: 20200325201224) do

  create_table "posts", force: :cascade do |t|
    t.string  "title"
    t.text    "content"
    t.integer "uid"
    t.integer "student_id"
  end

  create_table "students", force: :cascade do |t|
    t.string   "name"
    t.string   "password_digest"
    t.datetime "created_at",      null: false
    t.datetime "updated_at",      null: false
  end

  create_table "users", force: :cascade do |t|
    t.string  "name"
    t.integer "year"
    t.integer "uid"
    t.integer "student_id"
  end

end

Большое спасибо за помощь !!!!

1 Ответ

0 голосов
/ 26 марта 2020

def current_user @current_user ||= Student.find(session[:student_id]) end

Это неправильно, что вы получаете ученика, а не пользователя

сделайте это

def current_user @current_user ||= User.find(session[:student_id]) end

, потому что у пользователя есть UID и нет никаких отношений, чтобы делать что-то вроде student.user.uid

Чтобы найти пост, сделайте это Post.where(uid: @current_user.uid)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...