这个问题是关于我在询问上一个问题后遇到的问题Rails - How do I refresh a page without reloading it?
一直在使用Google搜索但无法找到解决方案。
我正在构建一个函数,每次人们访问该页面时都会发出随机记录,但如果用户刷新页面,随机记录将再次更改。
因此我尝试过使用cookies
#posts_controller.rb
def new
@random = cookies[:stuff] ||= Stuff.random
end
并在@random.content
视图中调用posts/new
,因为我只想要Stuff
模型的内容,当我第一次访问该页面时很好但是当我刷新时页面,它给了我这个错误
undefined method 'content' for "#<Stuff:0x0000010331ac00>":String
有没有办法解决这个问题?
谢谢!
---- ----更新
我已使用content
修复了<%= show_random(@random)['content'] %>
缺失问题,并使用
Internal Server Error expected Hash (got Array) for param 'post'
<%= f.hidden_field :stuff_id , :value => show_random(@random)[:id] %>
东西/ new.html.erb
# app/views/stuff/new.html.erb
<%= show_random(@random)[:content] %>
<div>
<%= f.hidden_field :stuff_id , :value => show_random(@random)[:id] %><br>
</div>
但是在创建Post而没有经过验证时,它会给我
no implicit conversion of Stuff into String
Extracted source (around line #2):
1
2 <%= show_random(@random)['title'] %>
我认为这与我的 Posts_controller.erb
中的创建操作有关请查看我的 Posts_controller.erb
def create
@post = current_user.posts.build(post_params)
if @post.save
flash[:success] = "Post created successfully!"
else
@random = Stuff.where(id: params[:post][:stuff_id]).first
render 'new'
end
end
答案 0 :(得分:1)
第一次,因为cookies [:stuff]为null,所以将一个新的Stuff实例分配给cookies [:stuff]和@random,因此@random上的内容方法调用将没问题。但是当您将对象存储到cookies [:stuff]中时,该值将自动由rails转换为字符串。
第二次访问页面时,cookies [:stuff]不为空,并分配给@random变量。但是如前所述,cookie中的内容是一个字符串,因此在字符串上调用content方法是行不通的。
答案 1 :(得分:0)
使.random
上定义的Stuff
方法返回序列化记录,然后您可以在视图中反序列化(可能使用辅助方法)以使其成为哈希:
# app/models/stuff.rb
def self.random
random_record_magic.to_json
end
end
# app/views/stuff/index.html.erb
<%= show_random(@random)['content'] %>
# app/helpers/stuff_helper.rb
def show_random(random)
JSON.parse(random)
end