1

午後はみんな、

曲名、曲の文字列フィールド、および user_id フィールドを持つ投稿モデルがあります。ユーザーは、最大 10,000 文字の新しい曲を作成できます。短い曲を保存すると、全体が問題なく表示されますが、ユーザーが400文字を超える長い曲を入力すると、そのほとんどが切り取られて約200文字しか表示されないように見えます。編集時に同じことが起こります。歌の残り、それはまだそれを切り取ります。データベースはMysqlであり、コンソールで確認すると、完全なエントリも保存されていないようです。曲は、ETWR[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 } %>

誰かに何かアイデアがあれば大歓迎です。さらにコードが必要な場合は、質問してください。乾杯するアンディ。

4

2 に答える 2

2

データベース フィールドが、文字列を 255 文字に制限する varchar として定義されている可能性があります。でもすぐに確認できると思います。

于 2012-08-15T10:21:25.667 に答える
1

Dane がすでに指摘しているように、おそらくこれらの長い文字列を限られた容量のデータベース フィールド (たとえば、固定された定義可能な長さを持つvarchar ) に格納しようとしています。長い文字列を保存するには、フィールド タイプテキスト(長さに制限はありません) を使用するだけです...

データベースを変更するには、sql を使用します。

ALTER TABLE your_table CHANGE COLUMN your_column your_column TEXT;

または、以下を含む移行を使用します。

change_column :your_table, :your_column, :text

更新: このようなエラーを回避するには、MySQL の厳密モードを有効にすることもできます: http://www.mysqlperformanceblog.com/2009/02/07/beware-of-mysql-data-truncation/。Strict モードでは、短すぎるフィールドに長すぎる文字列を保存しようとすると、エラーがスローされます。

于 2012-08-15T13:04:28.723 に答える