不确定关联是不是在我的 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
【问题讨论】:
users
和 links
表的外观如何?链接表中是否有 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)不保存任何记录
我想在我的 rails 应用程序中实现组权限。最有效的方法是啥?