How to handle non model data in form?

Hey,

I got a form which looks like this:

  • form_for(@article, :html => {:multipart => true}, :url =>
    articles_path) do |f|
    = errors_for(@article)

    .field
    = f.label :text
    %br
    = f.text_field :text

    .field
    = f.label :author_id
    %br
    = f.text_field :author_id

    .actions
    = f.submit

But since I don’t want anyone to type in an author id I changed it to:
.field
= f.label :author_name
%br
= f.text_field :author_name

added to article.rb:
attr_accessible :author_name

def before_validation
if self.author_name
author_name = self.author_name.split
self.author =
Author.find_or_create_by_firstname_and_lastname(author_name[0],
author_name[1])
end

But now this line:
@article = Article.new(params[:article])
throws this error:
unknown attribute: author_name

I thought attr_accessible would cover that? How can I make this work?

Hi,

added to article.rb:
attr_accessible :author_name

You should use attr_accessor instead (not attr_accessible, as You
don’t have the author_name DB column).

On 20 May 2011 05:01, Heinz S. [email protected] wrote:

.field
%br
author_name[1])
end

But now this line:
@article = Article.new(params[:article])
throws this error:
unknown attribute: author_name

I thought attr_accessible would cover that? How can I make this work?

I think you probably want ‘attr_accessor’ instead of ‘attr_accessible’.

‘attr_accessor’ is a Ruby feature that creates getter and setter
methods (#author_name and #author_name=) for an instance variable.

‘attr_accessible’ is part of Rails’ mass-assignment feature; it
white-lists an existing attribute as assignable via mass-assignment.

They’re easily confused, thanks to the similar names.

Chris

Yes, of course! Thank you guys :slight_smile: