How to put angularjs attributes in rails erb - ruby-on-rails

I have a rails form that looks like this:
<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %>
<%= devise_error_messages! %>
<div><%= f.label :email %><br />
<%= f.text_field :email %></div>
<div><%= f.label :password %><br />
<%= f.text_field :password %></div>
<div><%= f.label :current_password %> <i>(we need your current password to confirm your changes)</i><br />
<%= f.password_field :current_password, autocomplete: "off" %></div>
<div><%= f.submit "Update" %></div>
<% end %>
However, I'd like to tie the email text field to an AngularJS model, so that the value of the email form input is always tied to a $scope variable. In plain HTML, it would look like this:
<input name="email" ng-model="myValue"></input>
However since it's erb and not plain html, I'm not sure how to tie angular data to it.
How can I connect an ng-model attribute to an erb form in rails?

You should pass the angular attributes in the data attribute of the input, like so:
<%= f.text_field :email, data: { 'ng-model' => 'myValue' } %>
This will add the angular attribute with a data- prefix.

Related

Rails registration on landing page to complete registration

I have a home-landing-page that is my root url. I want users to begin the sign up process here where they input only their email, click signup, and continue the registration on a separate page.
This is the part of the form I want on the home-root-landing-page
<div>
<%= f.label :email %><br />
<%= f.email_field :email %>
</div>
This is what the full (separate) signup page looks like. I would like the email address the users entered on the home-root-landing-page to auto populate on this page (after they hit signup and are redirected to this page.)
<h2>Sign up</h2>
<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
<%= devise_error_messages! %>
<div><%= f.label :first_name %><br />
<%= f.text_field :first_name %></div>
<div><%= f.label :last_name %><br />
<%= f.text_field :last_name %></div>
<div><%= f.label :profile_name %><br />
<%= f.text_field :profile_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>
<div><%= f.submit "Sign up" %></div>
<% end %>
<%= render "devise/shared/links" %>
I'm using devise and I'm having trouble on how I would simply approach this. Thanks for taking a look.
In your view that you are rendering in homepage, set the form action to the signup page /user/signup.
In the signup controller, initialize the #user with the params that you've received from the homepage.
#UsersController
def signup
#user = User.new(params[:user]
end
The above action will render signup view. Now use #user in the form_for. Like:
form_for(#user)
This will auto populate the first name and email.
However, it is apparent that you're using Devise. I'm not sure it will work for its default controllers as it is initilizing the resource from empty hash (i see the following code in source)
def new
resource = build_resource({})
respond_with resource
end
So, you may have to override the registration controller.

update a table which in not devise model on sign up using devise?

How to add value from devise registration form to another table that is not devise table
this is sample code
<div class="signin">
<h2>Register</h2>
<%= 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 :password %><br />
<%= f.password_field :password %></div>
<div><%= f.label :password_confirmation %><br />
<%= f.password_field :password_confirmation %></div>
<div><%= f.label :full_name %><br />
<%= f.text_field :full_name %></div>
<div><%= f.submit "Register" %></div>
<% end %>
<%= render :partial => "devise/shared/links" %>
</div>
full name is field of profile table and i set device on user table,
and if user enter name i want name full name store in profile table
i dont have any idea how can i do this?
you can use one of the many hooks that are provided by active record models:
http://guides.rubyonrails.org/active_record_validations_callbacks.html#creating-an-object
ie. you could retrieve the profile object of the user, update the record and save it back in an before_save hook.
I got the answer
Put a def in devise model def name same as field name then devise allow you to pass the that field to model, in model/controller you can insert value through params in any table.

How to add CarrierWave uploader to Devise registration view? (rails gems)

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 %>

Devise edit account information

When I go to the edit_user_registration_path provided by Devise I have fields such as email and username pre-filled.
I want to create custom user profile page with the similar form for edit user information containing additional fields of dependent model. And I want fields be pre-filled.
How should I do it properly?
The default form provided by Devise:
<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put }) do |f| %>
<%= devise_error_messages! %>
<div><%= f.label :email %><br />
<%= f.email_field :email %></div>
<div><%= f.label :username %><br />
<%= f.text_field :username %></div>
<div><%= f.label :password %> <i>(leave blank if you don't want to change it)</i><br />
<%= f.password_field :password, :autocomplete => "off" %></div>
<div><%= f.label :password_confirmation %><br />
<%= f.password_field :password_confirmation %></div>
<div><%= f.label :current_password %> <i>(we need your current password to confirm your changes)</i><br />
<%= f.password_field :current_password %></div>
<div><%= f.submit "Update" %></div>
<% end %>
Use nested attributes
In your devise user model, if you have other dependent models, you can add a relationship between those models, like has_many and belongs_to. The do this:
Devise user model:
accepts_nested_attributes_for :name_of_other_model
Then in your form you can use fields_for. fields_for docs
Here's also a great railscast of this here

Accept Old Password To Edit Settings

I have a user model with a settings page at /users/1/edit
Currently you can change the email and change your password (w/ confirmation).
I would like to have a field called "current_password" where the user has to type their current password before they can change any information.
Here is my form now:
<%= form_for(#user) do |f| %>
<%= render 'shared/error_messages', :object => f.object %>
<div class="field">
<%= f.label :email %><br />
<%= f.text_field :email %>
</div>
<div class="field">
<%= f.label :password %><br />
<%= f.password_field :password %>
</div>
<div class="field">
<%= f.label :password_confirmation, "Confirmation" %><br />
<%= f.password_field :password_confirmation %>
</div>
<div class="actions">
<%= f.submit "Update" %>
</div>
<% end %>
Obviously if I just add the field in, it gives me an error because my user model doesn't have a "current_password" attribute.
How can I do this? Is there a better way, possibly?
You can either add it to the model and database or this to your model:
add attr_reader :current_password
Then you can do a validation of that in your model.

Resources