我的应用有用户,用户可以发布我的应用的链接。我设置了关联,以便用户has many :links
和用户belong_to
链接(请参阅下面的模型)。现在我试图让用户的电子邮件显示在show模板中,我为Link.user获取新链接的零值。有人可以解释一下原因吗?我的协会不正确吗?发布链接时,用户已登录。
用户模型:
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
答案 0 :(得分:0)
确保在创建时实际将链接分配给用户。
使用rails控制台。尝试循环链接并确保它们具有user_ids:
在rails控制台中:
ap Link.all.map(&:user)
如果他们确实由用户拥有
<%= @link.user.email %>
应打印出电子邮件。
您应该可以在控制器中执行以下操作:
@user.links << params[:new_link]
确保有很多工作。
答案 1 :(得分:0)
你正在使用装饰。在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