【问题标题】:Ruby on Rails: User_id and category_id is nilRuby on Rails:User_id 和 category_id 为 nil
【发布时间】:2015-10-10 21:30:37
【问题描述】:

在我上一个问题 (Ruby on Rails: Relation between two models) 之后,我遇到了一些新问题:

我正在使用 Devise,您可以在电子邮件旁边输入用户名等。这有效,名称被保存到数据库中。

现在我试图在特定的“显示”页面上调用该用户名,以说明是谁创建了请求:

<%= @request.user.name if @request.user %>

此外,我只希望创建请求的特定用户能够删除和编辑:

<% if current_user && @request.user == current_user %>
   <%= link_to edit_request_path(@request), class: "btn btn-default" do %>
   <span class="glyphicon glyphicon-edit"></span>
       Edit
   <% end %>
   <%= link_to @request, method: :delete, data: { confirm: 'Bist du sicher?' }, class: "btn btn-default" do %>
   <span class="glyphicon glyphicon-trash"></span>
       Löschen
   <% end %>
<% end %>

为此,我在 requests_controller.rb 中设置了一个类:

def correct_user
  @request = current_user.requests.find_by(id: params[:id])
  redirect_to requests_path, alert: 'Keine Berechtigung bearbeiten' if @request.nil?
end

但是用户名和删除和编辑按钮都没有出现:(

这里是 request.rb:

class Request < ActiveRecord::Base
 belongs_to :category
 belongs_to :user
 validates :description, presence: true, length: { maximum: 500 }
 validates :title, presence: true
 validates :budget, presence: true
 validates :category, presence: true
end

和user.rb:

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
         has_many :requests
         validates :name, presence: true
end

我进行此迁移是为了将 UserID 添加到 Requests 模型中,以便我可以通过 @request.user.name 调用用户:

class AddUserIdToRequests < ActiveRecord::Migration
  def change
    add_column :requests, :user_id, :integer
  end
end

我的 request_controller.rb 的摘录:

class RequestsController < ApplicationController
before_action :correct_user, only: [:edit, :update, :destroy]

private
    def set_request
      @request = Request.find(params[:id])
    end

    def correct_user
      @request = current_user.requests.find_by(id: params[:id])
      redirect_to requests_path, alert: 'Keine Berechtigung bearbeiten' if @request.nil?
    end

    def request_params
      params.require(:request).permit(:title, :description, :tags, :budget, :name)
    end

【问题讨论】:

  • 你能展示你的模型吗?您的用户模型与请求模型的关系如何?
  • @Gerep thx 提示。完成!
  • 你说你已经创建了方法correct_user但是我看不到你在哪里调用它,你能添加你的请求控制器吗?
  • @Gerep 抱歉回复晚了(生病了)。我编辑了我的 request_controller.rb 的相关部分。

标签: ruby-on-rails devise


【解决方案1】:

确保在渲染视图之前调用方法 correct_user。第二点,确保request 对象有一个与之关联的user。(即@request.user 不应为nil)

你比较登录用户和所有者的方式在下面一行是错误的

<% if current_user && @request.user == current_user %>

应该是这样的

<% if current_user && @request.user.id == current_user.id %>

如果您比较对象,它们将不会相同。请比较id

【讨论】:

  • 那行不通。我之前使用过“”......所以它应该可以工作。我猜用户和请求表之间的关系不起作用(在数据库站点上..)。如何检查外键等是否正确?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-15
  • 1970-01-01
  • 1970-01-01
  • 2013-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多