Ruby on Rails:User_id和category_id是零

时间:2015-10-03 18:20:49

标签: ruby-on-rails devise

在我的上一个问题(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

1 个答案:

答案 0 :(得分:0)

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

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

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

它应该是这样的

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

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