不确定关联是不是在我的 rails 应用程序中有效

Posted

技术标签:

【中文标题】不确定关联是不是在我的 rails 应用程序中有效【英文标题】:Unsure if association is working in my rails app不确定关联是否在我的 rails 应用程序中有效 【发布时间】:2015-12-24 19:46:31 【问题描述】:

我的应用有用户,用户可以发布指向我的应用的链接。我设置了一个关联,以便用户 has many :links 和链接 belong_to 用户(请参阅下面的模型)。现在我正试图让用户的电子邮件出现在显示模板中,并且我为 Link.user 获得了新链接的 nil 值。有人可以解释为什么吗?我的关联不正确吗?发布链接时用户已登录。

用户模型:

class User < ActiveRecord::Base
    has_many :links
    acts_as_voter
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

end

链接模型:

class Link < ActiveRecord::Base
    belongs_to :user

    acts_as_votable

    attr_accessor :avatar
    mount_uploader :avatar, AvatarUploader
end

show.html.erb:

<%= time_ago_in_words(@link.created_at) %> by <%= @link.user.try(:email) %>

架构:

  create_table "links", force: :cascade do |t|
    t.string   "title"
    t.string   "url"
    t.datetime "created_at",                     null: false
    t.datetime "updated_at",                     null: false
    t.integer  "user_id"
  end

create_table "users", force: :cascade do |t|
    t.string   "email",                  default: "", null: false
    t.string   "encrypted_password",     default: "", null: false
    t.string   "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer  "sign_in_count",          default: 0,  null: false
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.string   "current_sign_in_ip"
    t.string   "last_sign_in_ip"
    t.datetime "created_at",                          null: false
    t.datetime "updated_at",                          null: false
  end

在链接控制器中创建链接;

  def new
    @link = Link.new
  end

  def create
    @link = Link.new(link_params)

    if @link.save
      redirect_to root_path
    else
      render 'new'
    end
  end

  private
    def link_params
      params.require(:link).permit(:title, :url, :avatar)
    end

【问题讨论】:

userslinks 表的外观如何?链接表中是否有 user_id 列? 我为链接和用户发布了我的架构。是的,链接表中有一个用户 ID @archana 一定要使用控制台检查关联,以确保正确创建记录。请参阅下面的答案。 请同时向我们展示Link创建的代码。 我刚刚添加了用于创建链接的控制器操作@JohannesThorn 【参考方案1】:

确保链接在创建时实际分配给用户。

使用 rails 控制台。尝试遍历链接并确保它们具有 user_ids:

在 Rails 控制台中:

ap Link.all.map(&:user)

如果它们确实归用户所有

<%= @link.user.email %>

应该打印出电子邮件。

你应该能够在你的控制器中做这样的事情:

@user.links << params[:new_link]

确保大部分工作正常。

【讨论】:

【参考方案2】:

您正在使用设计。在您的 Link 控制器中,您必须验证您的登录用户。

# app/controllers/links_controller.rb
  before_action :authenticate_user!

  def create
    @link = current_user.links.new(link_params)
    if @link.save
      redirect_to root_path
    else
      render 'new'  # generally this is a render 'edit'
    end
  end

我在这里截断了文件。请阅读devise manual

【讨论】:

以上是关于不确定关联是不是在我的 rails 应用程序中有效的主要内容,如果未能解决你的问题,请参考以下文章

rails:关联表(has_and_belongs_to_many)不保存任何记录

在 Heroku 中部署错误:es 不是有效的语言环境

我想在我的 rails 应用程序中实现组权限。最有效的方法是啥?

Rails 关联帮助 - 我是不是使用多态关联?

iOS Core Data:为 Rails 多态关联设置关系的方法

Rails 3 - 关联