2012-08-15 57 views
1

全部下午,Rails节省一半的帖子条目

我有一个发布模型,它有一个歌曲名称,歌曲字符串字段和一个user_id字段。用户可以创建最多10,000个字符的新歌曲。现在,当保存一首短歌曲时,它的整体显示效果都很好,但是当用户输入超过400个字符的长歌曲时,它似乎会将大部分歌曲截断,只显示大约200个字符,编辑时也会发生同样的情况,歌曲的遗迹,它仍然将其切断。数据库是Mysql并在控制台中检查,它似乎并没有保存完整的条目。歌曲以键盘格式写入,例如E T W R [TREW] | WEER。我有一个谷歌,并没有发现任何沿这些线路。

我的代码如下;

post.rb

class Post < ActiveRecord::Base 
    attr_accessible :song, :song_name, :user_id, :rating 
    has_many :comments, dependent: :destroy 
    has_many :ratings, dependent: :destroy 
    belongs_to :user 

    before_save :rating 

    validates_presence_of :user_id 
    validates :song_name, presence: true, length: { maximum: 70 } 
    validates :song, presence: true, length: { maximum: 10000 } 

    default_scope order: "posts.created_at DESC" 

posts_controller.rb

def show 
    @post = Post.find(params[:id]) 
    @comments = @post.comments 
    @ratings = @post.ratings 
    respond_to do |format| 
     format.html 
     format.json { render json: @post } 
    end 
    end 


    def new 
    @post = Post.new 
    respond_to do |format| 
     format.html # new.html.erb 
     format.json { render json: @post } 
    end 
    end 

    def edit 
    @post = Post.find(params[:id]) 
    end 

    def create 
    @post = current_user.posts.build(params[:post]) 
    respond_to do |format| 
     if @post.save 
     format.html { redirect_to @post, success: 'Post was successfully created.' } 
     format.json { render json: @post, status: :created, location: @post } 
     else 
     format.html { render action: "new", error: "please sign in to post" } 
     format.json { render json: @post.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    def update 
    @post = Post.find(params[:id]) 
    respond_to do |format| 
     if @post.update_attributes(params[:post]) 
     format.html { redirect_to @post, success: 'Post was successfully updated.' } 
     format.json { head :no_content } 
     else 
     format.html { render action: "edit", error: "please try again" } 
     format.json { render json: @post.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

和show.html.erb

<div class="center hero-unit"> 
    <h1><%= @post.song_name %></h1> 
    <p>Transcript by: <%= @post.user.name %><br/> 
    Rating: <%= @post.rating %>/10</p> 
    <br/> 
    <p><%= raw @post.song %></p> 
    <br/> 
    <span class="timestamp"> 
     updated <%= time_ago_in_words(@post.updated_at) %> ago. 
    </span> 
     <%= link_to 'Edit', edit_post_path(@post) %> 
    <br/> 
     <% if !signed_in %> 
     please login to rate songs 
     <% else %> 
     <%= render partial: "ratings/form", locals: { post_id: @post.id }%> 
     <% end %> 
    </div> 

<%= render partial: "comments/form", locals: { post_id: @post.id } %> 
<%= render partial: "comments/show", locals: { comments: @comments, post_id: @post.id } %> 

如果任何人有这将是非常赞赏的任何想法,如果你需要更多的代码,请问。欢呼安迪。

回答

2

这可能是数据库字段被定义为一个varchar,将字符串限制为255个字符。但我相信你可以快速检查。

+0

真棒,谢谢戴恩! – dodgerogers747 2012-08-15 11:01:34

1

Dane已经指出,您可能试图将这些长字符串存储在容量有限的数据库字段中(例如varchar,它具有固定的可定义长度)。只需使用字段类型文本(其长度不限)来保存长串...

更改数据库使用SQL:

ALTER TABLE your_table CHANGE COLUMN your_column your_column TEXT; 

或使用含迁移:

change_column :your_table, :your_column, :text 

更新: 为了避免这样的错误,你也可以使中号ySQL严格模式:http://www.mysqlperformanceblog.com/2009/02/07/beware-of-mysql-data-truncation/。如果您尝试在太短的字段中保存太长的字符串,严格模式会引发错误。

+0

伟大的技巧感谢severin! – dodgerogers747 2012-08-15 15:14:57

+1

我刚刚发现严格模式,以及它如何帮助预防这些问题。阅读我的答案更新的部分... – severin 2012-08-22 10:01:24

+0

这非常可爱,谢谢Severin! – dodgerogers747 2012-08-22 10:08:49