I have been having issues with form_for rendering. I want to have a _form.html.erb partial that deals with both the creation and editing of my Problem record. When I go down the route of using
<%= form_for(@problem) do |f| %>
I get the following error:
undefined method `model_name' for Problem::ActiveRecord_Relation:Class
In my routes.rb I have the following:
PW::Application.routes.draw do
root to: 'problems#index', via: :get
resources :problems do
member do
post 'up_vote'
post 'down_vote'
end
end
I also have this my in Problem Controller
class ProblemsController < ApplicationController
include Concerns::Votes
def new
@problem = Problem.new
end
def index
@problem = Problem.all
end
def show
@problem = find_problem
end
def create
@problem = current_user.problems.new(problem_params)
@problem.save
redirect_to @problem
end
private
def find_problem
@problem = Problem.find(params[:id])
end
def problem_params
params.require(:problem).permit(:name, :description, :url)
end
end
I can get it to work if I specify the following :
<%= form_for @problem.new, url: {action: "create"} do |f| %>
However I feel that this is repeating myself if I then have to make a separate partial just for the edit. I really cant work out why this doesn't want to work. Could it be I am rendering the form on index.html.erb?
Any help or direction would be very much appreciated.
LOL why didn't I see this earlier?
Could it be I am rendering the form on index.html.erb?
Yep, it's totally the problem. Reason is here:
Problem::ActiveRecord_Relation:Class
You're getting back a relation
object (defines a collection, rather than single record). This is caused by this:
#controller
def index
@problem = Problem.all
end
The error is beacuse form_for
expects a single record. You need to use this in your controller & it will work:
#controller
def index
@problem = Problem.new
@problems = Problem.all
end
#view
<%= @problems.each do |problem| %>
<%= problem.name %>
<% end %>
<%= form_for @problem do |f| %>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With