mercredi 11 janvier 2017

Ruby on Rails: Why don't my radio buttons have values assigned to them?

In my RoR application I have a form to create a new email. On this form a user needs to be able to select the email account that they want to use to send the email. This required information is stored in tables User, Useraccount, Account, and Email as follows.

User             Useraccount                Account                  Email
id     name      user_id     account_id     id      emailaddress     id    subject      account_id
1      Ben       1           2              1       123@abc.com      1     First email  2
2      Gary      1           1              2       456@abc.com      2     Second email 1
3      Abigail   3           2              3       789@abc.com      3     Third email  3

So, when a user creates a new email I want them to be able to select a radio button that represents the email account they want to send the email from, when the select "send" the id of the account should be saved in the account_id column of the email table.

In order to do this, the list of a user's accounts needs to be retrieved from Useraccount and displayed as radio buttons on the form, for example the user Ben would have the option of selecting a radio button for account 2 (456@abc.com) or account 1 (123@abc.com).

So far I have been able to get the radio buttons displayed on the form but when the email is saved the value 0 is saved in the database, so I assume that this is because the radio buttons do not have a value assigned to them. Could someone please help me with this?

My code is as follows.

Emails_controller:

class EmailsController < ApplicationController
    def index
        @emails = Email.all
    end
    def show
        @email = Email.find(params[:id])
        @recipients = Recipient.where(email_id: @email.id)
    end
    def new
        @email = Email.new
        @email.recipients.build
        @useraccounts = Useraccount.where(user_id: session[:user_id])
    end
    def edit
        @email = Email.find(params[:id])
    end
    def create
        @email = Email.new(email_params)
        if @email.save
            redirect_to @email
        else
            render 'new'
        end
    end
    def update
        @email = Email.find(params[:id])
        if @email.update(email_params)
            redirect_to @email
        else
            render 'edit'
        end
    end
    def destroy
        @email = Email.find(params[:id])
        @email.destroy
        redirect_to emails_path
    end
    private
    def email_params
        params.require(:email).permit(:subject, :message, :account_id, { contact_ids: [] }, { group_ids: [] })
    end
end

app/views/email/_form.html.erb

<%= form_for @email do |f| %>

  <% if @email.errors.any? %>
    <div id="error_explanation">
      <h2>
        <%= pluralize(@email.errors.count, "error") %> prohibited this email from being saved:
      </h2>
      <ul>
        <% @email.errors.full_messages.each do |msg| %>
          <li><%= msg %></li>
        <% end %>
      </ul>
    </div>
  <% end %>

  <% @useraccounts.each do |useraccount| %>
        <%= f.label :account_id, useraccount.account.email, :value => "true"  %>
        <%= f.radio_button :account_id, false, :checked => false %>
  <% end %>

  <p>
    <%= f.label :subject %><br>
    <%= f.text_field :subject %>
  </p>

  <p>
    <%= f.label :message %><br>
    <%= f.text_area :message %>
  </p>

 <%= f.collection_check_boxes :contact_ids, Contact.where(user_id: session[:user_id]), :id, :firstname ,{ prompt: "firstname" } %>
 </br>
 <%= f.collection_check_boxes :group_ids, Group.where(user_id: session[:user_id]), :id, :name ,{ prompt: "name" } %>

  <p>
    <%= f.submit %>
  </p>

<% end %>

In this form it is the lines:

  <% @useraccounts.each do |useraccount| %>
        <%= f.label :account_id, useraccount.account.email, :value => "true"  %>
        <%= f.radio_button :account_id, false, :checked => false %>
  <% end %>

That display the radio buttons.

My models are:

class Useraccount < ActiveRecord::Base
  belongs_to :user
  belongs_to :account
end
class Account < ActiveRecord::Base
  has_many :emails
  has_many :useraccounts
end
class Email < ActiveRecord::Base
  belongs_to :email
  has_many :recipients
  has_many :contacts, through: :recipients, :dependent => :destroy
  has_many :groups, through: :recipients, :dependent => :destroy

  validates :subject, presence: true, length: { minimum: 1 }
end
class User < ActiveRecord::Base 
  validates :firstname, presence: true, uniqueness: true
  has_secure_password
end

I would much appreciate some help on this.

Aucun commentaire:

Enregistrer un commentaire