Rails calling different fields in the same table - mysql

I want to call different fields in the same table,
Assignedby != Openedby
I cannot call the user to which the topic is assigned
mysql users table
mysql issues table
show.html.erb screenshot
<p>
<strong>Assignedby:</strong>
<%= #issue.user.try(:fullname) %>
</p>
<p>
<strong>Openedby:</strong>
<%= #issue.user.try(:fullname) %>
</p>
class Issue < ApplicationRecord
belongs_to :project, foreign_key: :project_id, optional: true
belongs_to :user, foreign_key: :assignedby_id, optional: true
belongs_to :user, foreign_key: :openedby_id, optional: true
belongs_to :user, foreign_key: :closedby_id, optional: true
end

You cannot give all these belongs_to associations the same name, they need to be different, for example:
class Issue < ApplicationRecord
with_option optional: true do
belongs_to :project
belongs_to :assigner, class_name: 'User', foreign_key: :assignedby_id
belongs_to :creator, class_name: 'User', foreign_key: :openedby_id
belongs_to :closer, class_name: 'User', foreign_key: :closedby_id
end
end

Related

uninitialized constant User::follow Extracted source (around line #28):

i have an error in my user.rb model (around line #28):
27def following?(user)
28 following.include?(user)
29end
Any idea what I could be doing wrong here?
Showing C:/instagramm/instagram-clone/app/views/accounts/profile.html.erb where line #11 raised:
my profile.html.erb :
<% if #users.image.present %>
<%= image_tag #users.image %>
<% end %>
<strong><h1><%= #users.full_name %></h1></strong>
<% if user_signed_in? && #user == current_user %>
<%= link_to"Edit Profile", edit_user_registration_path(#user) %>
<% if current_user.following?(#user) %>
<%= link_to"Unfollow", follows_path(user_id: #user.id), method: :delete %>
<% else %>
<%= link_to"Follow", follows_path(user_id: #user.id) %>
<% end %>
<% end %>
<div> <%= #users.posts.count %> Posts </div>
<p><%= #users.full_name %></p>
<p><%= #users.description %></p>
<p><%= link_to 'User Website', #users.website if #users.website.present? %></p>
<%= #posts.each do |post|%>
<%= image_tag post.image %>
<% end %>
my model : follow.rb
class Follow < ApplicationRecord
belongs_to :follower, class_name: 'user'
belongs_to :followed, class_name: 'user'
validates :follower_id, presence: true
validates :followed_id, presence: true
end
and this is my user.rb model : the error is around(#line28) in def following?(user)
class User < ApplicationRecord
has_many :posts
validates :username, presence: true
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
has_one_attached :image
has_many :active_follows, class_name: "follow", foreign_key: "follower_id", dependent: :destroy
has_many :passive_follows, class_name: "follow", foreign_key: "followed_id", dependent: :destroy
has_many :following, through: :active_follows, source: :followed
has_many :followers, through: :passive_follows, source: :follower
def follow(user)
active_follows.create(followed_id: user.id)
end
def unfollow(user)
active_follows.find_by(followed_id: user.id).destroy
end
def following?(user)
following.include?(user)
end
def full_name
"#{first_name} #{last_name}"
end
end
Rails assumes that association points to a class with matching name, so in this case your following association will search for Following class.
Obviously it is not what you need here - having a quick guess by the code structure that you expect following to return a collection of Users, so you need to tell that to your association:
has_many :following, through: :active_follows, source: :followed, class_name: 'User'
It is also important to use correct class names given to class_name option. It has to match the name of the ActiveRecord class exactly, so it must be "Follow" not "follow" and, similarly, "User" not "user"
You already got response from #BroiStase you are using incorrect name of classes in your code. Please change your Follow.rb
class Follow < ApplicationRecord
belongs_to :follower, class_name: 'User'
belongs_to :followed, class_name: 'User'
validates :follower_id, presence: true
validates :followed_id, presence: true
end
In your User.rb following you have to do following changes.
class User < ApplicationRecord
has_many :posts
validates :username, presence: true
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
has_one_attached :image
has_many :active_follows, class_name: "Follow", foreign_key: "follower_id", dependent: :destroy
has_many :passive_follows, class_name: "Follow", foreign_key: "followed_id", dependent: :destroy
has_many :following, through: :active_follows, source: :followed
has_many :followers, through: :passive_follows, source: :follower
def follow(user)
active_follows.create(followed_id: user.id)
end
def unfollow(user)
active_follows.find_by(followed_id: user.id).destroy
end
def following?(user)
following.include?(user)
end
def full_name
"#{first_name} #{last_name}"
end
end
Please when you code avoid any extra spaces, line breaks and give proper 2 space indentions it will help you to understand code better. If still error please share error message also.

Rails4 has_many :through then how to get the value in new.html.erb

I use Rails4.2.8, Ruby2.5.0.
I had the multilevel relation in questions , classifies, tags , tables relations is like this :
My models :
class Question < ActiveRecord::Base
has_many :taggables,:dependent => :destroy, inverse_of: :question
has_many :tags, through: :taggables, :dependent => :destroy
belongs_to :classify
belongs_to :user
accepts_nested_attributes_for :tags
accepts_nested_attributes_for :taggables
end
class Tag < ActiveRecord::Base
has_many :taggables, :dependent => :destroy,inverse_of: :question
has_many :questions, through: :taggables, :dependent => :destroy,inverse_of: :question
belongs_to :classify
end
class Classify < ActiveRecord::Base
has_many :questions, :dependent => :destroy, inverse_of: :classify
has_many :tags, :dependent => :destroy, inverse_of: :classify
accepts_nested_attributes_for :questions
accepts_nested_attributes_for :tags
end
class Taggable < ActiveRecord::Base
belongs_to :question
belongs_to :tag
accepts_nested_attributes_for :question
end
My dbs:
class CreateQuestions < ActiveRecord::Migration
def change
create_table :questions do |t|
t.string :title
t.text :content
t.integer :classify_id
t.timestamps
end
end
end
class CreateTags < ActiveRecord::Migration
def change
create_table :tags do |t|
t.string :name
t.text :content
t.integer :classify_id
t.timestamps
end
end
end
class CreateClassifies < ActiveRecord::Migration
def change
create_table :classifies do |t|
t.string :name
t.text :content
t.timestamps
end
end
end
class CreateTaggables < ActiveRecord::Migration
def change
create_table :taggables do |t|
t.integer :question_id
t.integer :tag_id
t.timestamps
end
end
end
My controllers:
questions_controller.rb
def new
#question = Question.new
#question.taggables.build
#question.tags.build
end
classifies_controller.rb
def new
#classify = Classify.new
#classify.questions.build
#classify.tags.build
end
tags_controller.rb
def new
#tag = Tag.new
#tag.taggables.build
#tag.questions.build
end
My questions/new.html.erb
<%= form_for(#question) do |f| %>
<div class="form-group">
<%= f.label :classify, "Classify and Tags" %><br>
<div class="input-group tags" >
<div class="tags_select">
<%= f.select :classify_id, Classify.all.collect { |c| [c.name, c.id]},{}, class: "form-control" %> ##I can get the classify_id in questions
</div>
<div class="tags_input col-md-12">
<%= f.text_field :tag, class: "",multiple:"multiple",placeholder: "Please input the tags" %>
**## There how can I get the input tags , and record the id and name in `tags table` , `taggables table`? Then how can I show the tags name in the question `show.html.erb`?**
</div>
</div>
</div>
<% end %>
What I want is how to record the input tags id and name in tags table , taggables table,Then how can I show the tags name in the question show.html.erb?
Thansk so much for your help .

undefined method `cliq_requests' for nil:NilClass

I keep getting this annoying error consistently and I cannot solve it. I recently posted a question on the same topic and got no productive help.
I want users to request to join a group. Cliqs = Groups. All of my console tests seem correct, but I cannot seem to find a solution to my problem. The association is showing up, but I can't seem to get the update/accept method to run.
This is driving me crazy! How do I fix this?
Here is my code:
My Models:
class User < ActiveRecord::Base
has_many :uploads
has_one :owned_cliq, foreign_key: 'owner_id', class_name: 'Cliq', dependent: :destroy
has_many :cliq_memberships, dependent: :destroy
has_many :cliqs, through: :cliq_memberships
has_many :cliq_requests, dependent: :destroy
...
end
class Cliq < ActiveRecord::Base
belongs_to :owner, class_name: 'User'
has_many :cliq_memberships, dependent: :destroy
has_many :members, through: :cliq_memberships, source: :user
has_many :cliq_requests, dependent: :destroy #cliq_request_sender
has_many :pending_members, through: :cliq_requests, source: :user, foreign_key: 'user_id'
end
class CliqRequest < ActiveRecord::Base
#from
belongs_to :user
#to
belongs_to :cliq
#validate :not_member
#validate :not_pending
def accept
cliq.members << pending_member
destroy
end
end
My controller:
class CliqRequestsController < ApplicationController
def index
#incoming
##cliq_requests_received = CliqRequest.where(cliq: cliq)
#outgoing
##cliq_requests_sent = current_user.cliq_requests
end
def show
end
def create
cliq = Cliq.find_by(params[:id])
#cliq_request = current_user.cliq_requests.new(cliq: cliq)
if #cliq_request.save
redirect_to current_user #change to cliqs/cliq path later
else
redirect_to cliq_path
end
end
def update
#cliq = Cliq.find_by(id: params[:cliq_id])
#cliq_request = #cliq.cliq_requests.find_by(id: params[:id])
#cliq_request.accept
end
def destroy
#cliq_request.destroy
end
end
My View:
<h1><%= #cliq.name %></h1>
<%= link_to 'Request to join Cliq', '/cliqs/:cliq_id/cliq_requests', :method => :post %>
<% #cliq_members.each do |cliq_member| %>
<ul><%= link_to cliq_member.username, user_path(cliq_member) %></ul>
<% end %>
<% if #current_user = #cliq.owner %>
<% #cliq.pending_members.each do |pending_member| %>
<ul><%= link_to pending_member.username, user_path %>
<%= link_to "Accept", "/cliqs/:cliq_id/cliq_requests/:id/", :method => :put %>
<%= link_to "Deny", "/cliqs/:cliq_id/cliq_requests/:id/", :method => :delete %>
</ul>
<% end %>
<% end %>
My Routes:
resources :cliqs do
resources :cliq_requests
end
These lines appear malformed:
<%= link_to 'Request to join Cliq', '/cliqs/:cliq_id/cliq_requests', :method => :post %>
<%= link_to "Accept", "/cliqs/:cliq_id/cliq_requests/:id/", :method => :put %>
<%= link_to "Deny", "/cliqs/:cliq_id/cliq_requests/:id/", :method => :delete %>
I recommend you use path helpers [e.g. cliq_cliq_request_path(cliq, cliq_request) if you are using resourceful routing]. You can use rake routes for help. If you are seeing things like :cliq_id and and :id in your development.log or test.log as part of the URLs that are hit, those should instead be numbers. You can also interpolate the strings yourself (e.g. "/cliqs/#{cliq_id}/cliq_requests/#{cliq_request.id}") but this is usually more typing and certainly more fragile over time.
One of your problems may be that you are looping through a list of pending member names, which doesn't have all the data you need to form the link correctly. So your update action may be working fine, but you may not be passing it the right data.
Also this line:
if #current_user = #cliq.owner
is an assignment, and so will always return true. Presumably you mean ==

Associating a models using foreign keys

My goal is to have a setup where Users create Grants as funders and then other users are matched with grants as reachers. I've been playing around with a few options for the model set up such as:
class Grant < ActiveRecord::Base
belongs_to :funder, class_name:"User", foreign_key:"funder_id"
has_many :matches
has_many :researchers, class_name: "User", source: :user, through: :matches
class User < ActiveRecord::Base
has_many :matches
has_many :grants, through: :matches
class Match < ActiveRecord::Base
belongs_to :user
belongs_to :grant
Or ——————————————————————
class Grant < ActiveRecord::Base
has_many :funder_matches, :foreign_key => :researcher_id, :class_name => "Match"
has_many :researcher_matches, :foreign_key => :funder_id, :class_name => "Match"
has_many :researchers, through: :researcher_matches
has_many :funders, through: :funder_matches
class Match < ActiveRecord::Base
belongs_to :grant
belongs_to :user
belongs_to :funder, :class_name => "User"
belongs_to :researcher, :class_name => "User"
class User < ActiveRecord::Base
has_many :matches
has_many :grants, through: :matches
and then in the meantime grants are created by admin by visiting the users profile and passing in the user_id.
In the grant model I have:
def create_grant_with_associations(current_user)
current_user.grants << self
self.funder = current_user
self.save
end
I also have funder_id on the Grants table and in the grant controller I have
def create
#grant = ##user.grants.build(grant_params)
if #grant.save
#grant.create_grant_with_associations(##user)
flash[:info] = "The grant was successfully created"
redirect_to #grant
else
render 'new'
end
end
and then finally I have a collection select to allow admin to select grants and match them with the user.
<h4>Match a grant:</h4>
<%= form_for #user, :html => { :class => 'form-horizontal', :multipart => true } do |f| %>
<div class="field ">
<%= f.label :grants, "Select Grant" %>
<%= f.collection_select(:grant_ids, Grant.all, :id, :name,{:include_blank => 'Show No Grants Matched'}, :multiple => true) %>
</div>
<%= f.submit "Create Match", class: "btn btn-primary"%>
<% end %>
The problem I'm having now is that when i use the collection select it overrides the funder association. Am I on the right track?

Polymorphic Associations and signup forms Rails

I have a User table in Rails and it has 2 user types. I associated them with polymorphic associations, my models are:
class User < ActiveRecord::Base
belongs_to :owner, polymorphic: true
class Buyer < ActiveRecord::Base
has_one :user, as: :owner, dependent: :destroy
accepts_nested_attributes_for :user
class Seller < ActiveRecord::Base
has_one :user, as: :owner, dependent: :destroy
accepts_nested_attributes_for :user
I need a registration form in HTML for new users and automatically specify their type (each user type has their own registration link)
How do I manage the controllers and HTML form to do this? The user is going to fill the form with information for the User and Buyer or Seller model.
Thank you
You need 2 routes, one for buyer and another for seller. And then you can use Rail's form helpers:
<%= form_for :buyer do |f| %>
<%= f.fields_for :user %>
[your user fields here]
<% end %>
<% end %>
The form is analogous for the seller.