我正在使用bit.ly api并尝试设置我的控制器创建操作,以便我只能使用api一次,然后将缩短的链接存储在@micropost.link
中以这种方式在我的观点中引用它。
microposts_conroller.rb
def create
@micropost = current_user.microposts.build(micropost_params)
client = Bitly.client
url = client.shorten("https://www.myapp.com/microposts/#{@micropost.id}")
@micropost.link = url.short_url
respond_to do |format|
if @micropost.save
format.html {redirect_to root_url}
format.js
else
@feed_items = []
@microposts = []
render 'static_pages/home'
end
end
end
是否可以在创建动作中引用新创建的微博的id属性?
#{@micropost.id}
工作不起作用,我尝试了其他一些事情,但没有运气。我应该以不同的方式接近这个吗?
答案 0 :(得分:3)
假设您正在使用SQL数据库引擎,@micropost在您保存之前不会有ID。很可能你需要两次保存新创建的模型实例,一次获得一个id,然后第二次保存“link”属性。
答案 1 :(得分:2)
您使用的.build
仅构建模型,但不保存模型。
保存模型将设置ID。因此,您只能在保存模型后构建URL。
如果保存后未设置id,则会出现验证错误。
所以你的代码看起来像这样:
def create
@micropost = current_user.microposts.build(micropost_params)
if @micropost.save
url = Bitly.client.shorten(micropost_url(@micropost))
@micropost.update_attributes link: url.short_url
respond_to do |format|
format.html {redirect_to root_url}
format.js
end
else
@feed_items = []
@microposts = []
render 'static_pages/home'
end
end
我使用update_attributes
来更新数据库中的参数,这样更清晰,然后设置链接并再次保存。
答案 2 :(得分:1)
试试这个
def create
@micropost = current_user.microposts.build(micropost_params)
if @micropost.save #micropost is created
client = Bitly.client
#using the micropost id here below
url = client.shorten("https://www.myapp.com/microposts/#{@micropost.id}")
@micropost.link = url.short_url
respond_to do |format|
format.html {redirect_to root_url}
format.js
end
else
@feed_items = []
@microposts = []
render 'static_pages/home'
end
end