Rails - 如何在不重新加载页面的情况下刷新页面? (更新)

时间:2014-03-09 05:23:57

标签: ruby-on-rails cookies ruby-on-rails-4

这个问题是关于我在询问上一个问题后遇到的问题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

2 个答案:

答案 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
相关问题