I've added 2 new fields on my devise users: :first_name and :last_name
So in the registration page I've added these new fields to be filled by user.
<div>
<%= f.label :first_name %> <br>
<%= f.text_field :first_name, autofocus => true %>
</div>
<div>
<%= f.label :last_name %> <br>
<%= f.text_field :last_name %>
</div>
<div><%= f.label :email %><br />
<%= f.email_field :email %></div>
<div><%= f.label :password %><br />
<%= f.password_field :password %></div>
<div><%= f.label :password_confirmation %><br />
<%= f.password_field :password_confirmation %></div>
Initially the autofocus was set on :email field, but now I changed to :first_name field.
The problem is when I access this page i get this error:
undefined local variable or method `autofocus' for #<#<Class:0x361ef18>:0x449d630>
What forgot I to do in my rails app?
You forgot the : before the autofocus symbol, change it to:
<%= f.text_field :first_name, :autofocus => true %>
it should be :autofocus and not autofocus
<%= f.text_field :first_name, :autofocus => true %>
The colon : is missing at the start, should be a symbol, else its treated as if local variable/assign.
Related
I am trying to create a custom admin form for creating new users.
Here is the form:
admins/newwebsite.html.erb
<%= form_for(#branch) do |f| %>
<div><%= f.label :branch %><br />
<%= f.text_field :branch, autofocus: true %></div>
<div><%= f.label :email %><br />
<%= f.email_field :email %></div>
<div><%= f.label :password %><br />
<%= f.password_field :password, autocomplete: "off" %></div>
<div><%= f.label :password_confirmation %><br />
<%= f.password_field :password_confirmation, autocomplete: "off" %></div>
<div><%= f.submit "Sign up" %></div>
<% end %>
controller: controllers/admins_controller.rb
def newwebsite
#branch = Branch.new
end
def newwebsiteparams
params.require(:branch).permit(:branch, :email, :password, :password_confirmation)
end
def create
#branch = Branch.create(newwebsiteparams)
end
routes:
get 'admins/dashboard'
get 'admins/newwebsite'
post 'admins/create' => 'admins#create'
error:
undefined method `branches_path' for #<#<Class:0x57414d8>:0x57409f8>
Any help would certainly be appreciated.
rails g devise:views command generated that view
<h2>Sign up</h2>
<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
<%= devise_error_messages! %>
<div><%= f.label :username %><br />
<%= f.text_field :username, :autofocus => true %></div>
<div><%= f.label :email %><br />
<%= f.email_field :email, :autofocus => true %></div>
<div><%= f.label :password %><br />
<%= f.password_field :password %></div>
<div><%= f.label :password_confirmation %><br />
<%= f.password_field :password_confirmation %></div>
<div><%= f.submit "Sign up" %></div>
<% end %>
<%= render "devise/shared/links" %>
My question is how does it work " form_for(resource, : as=>resource_name, ..."
resource is simple a record (or object) - with respect to Devise, it's usually something called User or similar. The rest of the parameters for form_for are options, detailed in the form_for docs.
I notice that both the :email and :username are calling for the email_field, which is a mistake.
When users register, I want them to be able to upload an avatar. The new registration .html.erb looks like this:
<h2>Sign up</h2>
<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => {:multipart => true} ) do |f| %>
<%= devise_error_messages! %>
<div>
<%= f.label :username %><br />
<%= f.text_field :name %>
</div>
<div>
<%= f.label :image %><br />
<%= f.file_field :image %>
</div>
<div><%= f.label :email %><br />
<%= f.email_field :email %></div>
<div><%= f.label :password %><br />
<%= f.password_field :password %></div>
<div><%= f.label :password_confirmation %><br />
<%= f.password_field :password_confirmation %></div>
<div><%= f.submit "Sign up" %></div>
<% end %>
<%= render "links" %>
User.rb:
class User < ActiveRecord::Base
....
mount_uploader :image, ImageUploader
ImageUploader exists...
When I try to visit the view, it tells me that User::ImageUploader doesn't exist. When I try to specify the fully qualified name of the class in the user model, either as an 'include' statement or as an argument to the mount_uploader function, it can't find that either. Do I need to somehow build in a separate form_tag in that view? I'm sure this has been done before. Any help is appreciated.
Have you:
Added an :image column to your User model?
Defined the uploader app/uploaders/image_uploader.rb?
Restarted your server?
You shouldn't need to have this as a separate form tag, as long as the image attribute exists on the User model.
You may need to check your form markup. I notice you have :username on the label and :name on the field.
Try changing:
<%= f.label :username %><br />
<%= f.text_field :name %>
to
<%= f.label :name, "username" %><br />
<%= f.text_field :name %>
I am trying to add forms fields to my Devise user registration view. This has been achieved and the validation runs when I submit the form. However, if I get any form errors, the input data does not re-populate the form field as per the original form although I can see the correct values in my little debugger I've added to the development views.
Here is my view:
<h2>Sign up</h2>
<% resource.build_profile %>
<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
<%= devise_error_messages! %>
<div><%= f.label :email %><br />
<%= f.email_field :email %></div>
<div><%= f.label :username %> <i>(this cannot be changed so choose wisely)</i><br />
<%= f.text_field :username %></div>
<div><%= f.label :password %><br />
<%= f.password_field :password %></div>
<div><%= f.label :password_confirmation %><br />
<%= f.password_field :password_confirmation %></div>
<%= f.fields_for :profile do |profile_form| %>
<div><%= profile_form.label :full_name %><br />
<%= profile_form.text_field :full_name %></div>
<div><%= profile_form.label :birth_date %><br />
<%= profile_form.date_select :birth_date, start_year: Time.now.year, end_year: Time.now.year - 80, order: [:day, :month, :year], prompt: { day: 'Choose day', month: 'Choose month', year: 'Choose year' } %></div>
<div><%= profile_form.label :gender %><br />
<%= profile_form.select :gender, { "Male" => '0', "Female" => '1' } %></div>
<div><%= profile_form.label :postcode %><br />
<%= profile_form.text_field :postcode %></div>
<div><%= profile_form.label :description, "About you" %><br />
<%= profile_form.text_area :description %></div>
<% end %>
<div><%= f.submit "Sign up" %></div>
<% end %>
<%= render :partial => "devise/shared/links" %>
I don't have a controller code to show because it uses the Devise code inside the Gem. What am I doing wrong / not doing?
You are rebuilding the profile every time with build_profile, it means that when the form in going to be redisplayed, it's using a new instance of profile, not the one with errors. Just change that code so it only builds the profile if one does not exist:
resource.build_profile unless resource.profile
Something like that should work.
Carlos' answer helped me solve this exact issue.
resource.build_profile unless resource.profile
If your user model has a reference to the profile model, try passing
<%= f.fields_for resource.profile do |profile_form| %>
Right now, you're passing a reference to a model, but the form wants an instance.
I am using Devise for authentication in a Rails 3 app. I added first_name and last_name columns to the database via db:migrate. The registration form was modified like so:
<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
<%= devise_error_messages! %>
<p><%= f.label :first_name %><br />
<%= f.text_field :first_name %></p>
<p><%= f.label :last_name %><br />
<%= f.text_field :last_name %></p>
<p><%= f.label :email %><br />
<%= f.text_field :email %></p>
<p><%= f.label :password %><br />
<%= f.password_field :password %></p>
<p><%= f.label :password_confirmation %><br />
<%= f.password_field :password_confirmation %></p>
<p><%= f.submit "Sign up" %></p>
<% end %>
Validation in the User model:
validates :first_name, :last_name, :email, :password, :password_confirmation, :presence => true
For some reason I am getting "First name can't be blank" and "Last name can't be blank" validation errors. It is interesting to note that these are the two fields added in addition to the stock Devise fields. Does Devise prevent adding other fields to the User model? What other reason could there be?
Thanks.
Probably your user model has defined attr_accessible. if this is true then you have to add :first_name and :last_name to the list.