简体   繁体   中英

Rails -TypeError: can't cast ActionController::Parameters to text

I'm developing a website using jQuery Preview to fetch the title, description or favction_url of any link.

jQuery Preview: https://github.com/embedly/jquery-preview/

My links controller has this code:

class LinksController < ApplicationController
    before_action :find_link, :only => [:edit, :update, :destroy]

    def index
        @links = Link.all
    end

    def new
        @link = Link.new
    end

    def create
        @link = Link.new(:content => link_params, :title => params[:title], :description => params[:description], :favicon_url => params[:favicon_url])

        if @link.save
            redirect_to root_path
        else
            render :new
        end
    end

    def edit
    end

    def update

        if @link.update_attributes(link_params)
            redirect_to root_path
        else
            render :edit
        end
    end

    def destroy
        @link.destroy

        redirect_to root_path
    end

private

    def link_params
        params.require(:link).permit(:content)
    end

    def find_link
        @link = Link.find(params[:id])
    end
end

And in my views/links/new.html.erb has this code:

<script>
    // Set up preview.
    $('#url').preview({key:'key'})

    // On submit add hidden inputs to the form.
    $('form').on('submit', function(){
      $(this).addInputs($('#url').data('preview'));
      return true;
    });
</script>

<h1>Share Link</h1>
<%= simple_form_for @link do |f| %>
    <%= f.input :content, :input_html => {:id => "url"} %>
    <div class="selector-wrapper"></div>
    <%= f.button :submit, :disable_with => "Submiting...", :class => "btn btn-primary btn-large" %>
<% end %>

But when I click submit, I got an error :

TypeError: can't cast ActionController::Parameters to text: INSERT INTO "links" ("content", "created_at", "description", "favicon_url", "title", "updated_at") VALUES (?, ?, ?, ?, ?, ?)

And it marked this line of links controller code:

if @link.save

Can anyone help me? Thank you.

The parameters I got is like following, except content , others are from jQuery Preview:

Parameters: {"utf8"=>"✓", 

"authenticity_token"=>"NDqZbleBkEEZzshRlTM+d6GZdVEGAoO1W/mp7B68ZZ0=", 

"link"=>{"content"=>"http://stackoverflow.com/questions/20815513/rails-typeerror-cant-cast-actioncontrollerparameters-to-text/20815623?noredirect=1#20815623"}, 

"commit"=>"submit", 

"original_url"=>"http%3A//stackoverflow.com/questions/20815513/rails-typeerror-cant-cast-actioncontrollerparameters-to-text/20815623%3Fnoredirect%3D1%2320815623", 

"url"=>"http%3A//stackoverflow.com/questions/20815513/rails-typeerror-cant-cast-actioncontrollerparameters-to-text", 

"type"=>"html", 

"provider_url"=>"http%3A//stackoverflow.com", 

"provider_display"=>"stackoverflow.com", "provider_name"=>"Stackoverflow", 

"favicon_url"=>"http%3A//cdn.sstatic.net/stackoverflow/img/favicon.ico", 

"title"=>"Rails%20-TypeError%3A%20can%27t%20cast%20ActionController%3A%3AParameters%20to%20text", 

    "description"=>"I%27m%20developing%20a%20website%20using%20jQuery%20Preview%20to%20fetch%20the%20title%2C%20description%20or%20favction_url%20of%20any%20link.", 

"thumbnail_url"=>"http%3A//cdn.sstatic.net/stackoverflow/img/apple-touch-icon@2.png%3Fv%3Dfde65a5a78c6", 

"author_name"=>"", 

"author_url"=>"", 

"media_type"=>"", 

"media_html"=>"", 

"media_width"=>"", 

"media_height"=>""}

In your create action you're trying to assign link_params hash as value for content which expects text.

With the call to Link.new(...) passing in attributes you are mass assigning attributes, and with Rails4 strong parameters you need to add all the attributes to the permit list that you will be mass assigning.

Update the create and link_params method definition as follows:

# app/controllers/links_controller.rb

def create
    @link = Link.new(link_params)

    if @link.save
        redirect_to root_path
    else
        render :new
    end
end

private

def link_params
    params.require(:link).permit(:content, :title, :description, :favicon_url)
end

Update: Merge certain attributes from the parameter hash and merge them to params[:link]

# app/controllers/links_controller

private

def link_params
  # Select parameters you need to merge
  params_to_merge = params.select { |k, v| ['title', 'description', 'favicon_url'].include?(k) }
  params.require(:link).permit(:content).merge(params_to_merge)
end

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM