Rails - How to send parameters from form to def create in controller -
i have create function
def create @project = current_user.projects.where(id: params[:id]).first_or_create(project_params) if @project.save flash[:success] = "project created!" redirect_to root_url else flash[:success] = "project not created!" redirect_to root_url end end
what im trying data params:id can check if object exists.
heres relevant form
<%= bootstrap_form_for(@project) |f| %> <%= render 'shared/error_messages', object: f.object %> <div class="col-md-4"> <div class="field"> <%= f.text_field :project_title, :value=>params[:project_title] , label: "title"%> </div> <div class="col-md-4"> <div class="field project-save-button"> <%= f.submit "save entry", class: "btn-sm btn-danger" %> </div> <% end %>
when hit submit button sql query generated is
select "projects".* "projects" "projects"."user_id" = ? , "projects"."project_title" null order "projects"."created_at" desc limit 1 [["user_id", 1]]
how send through parameter form controller?
projects_controller
class projectscontroller < applicationcontroller before_action :logged_in_user, only: [:create, :destroy] before_action :correct_user, only: :destroy def create if current_user.projects.create(project_params) flash[:success] = "project created!" redirect_to root_url else flash[:success] = "project not created!" redirect_to root_url end end def destroy @project.destroy flash[:success] = "project deleted" redirect_to request.referrer || root_url end def update @project = current_user.projects.find(params[:id]) if @project.update_attributes(project_params) flash[:success] = "project updated!" redirect_to root_url else flash[:success] = "project not updated!" redirect_to root_url end end private def project_params params.require(:project).permit(:project_title, :project_subject, :project_type, :project_worth, :project_due_date, :project_details) end def correct_user @project = current_user.projects.find_by(id: params[:id]) redirect_to root_url if @project.nil? end end
you add hidden field form projects id:
<%= f.hidden_field :id, @project.id %>
update
i think main problem caused trying use create action either creating project or updating project. should creating new project in create action , use update action update existing project.
you below make create action work both it's bit hacky:
in view
<%= f.hidden_field(:id, @project.id) if @project.persisted? %>
in controller
if params[:id] @project = current_user.projects.find(params[:id]) @project.assign_attributes(project_params) else @project = current_user.projects.build(project_params) end if @project.save ...
the right way
i haven't used bootstrap_form_for
should work same normal form_for
except field formatting.
when do:
<%= bootstrap_form_for(@project) |f| %>
it should automatically check if @project persisted or not , make form new
form if isn't or make edit
form if is.
the new form submit create
action , edit
form should automatically insert projects id in hidden_field
, submit update
action. therefore should able keep original view code add update action in controller so:
update action
def update @project = current_user.projects.find(params[:id]) if @project.update_attributes(project_params) flash[:success] = "project updated!" redirect_to root_url else flash[:success] = "project not updated!" redirect_to root_url end end
create action
def create @project = current_user.projects.build(project_params) if @project.save flash[:success] = "project created!" redirect_to root_url else flash[:success] = "project not created!" redirect_to root_url end end
you'll need make sure have update route in routes too. just:
# routes.rb resources :projects
adding edit form
somewhere in views need create edit form. if want make edit form of current_users's projects:
<% current_user.projects.each |project| %> <%= bootstrap_form_for(project) |f| %> ... # rest of form here etc <% end %> <% end %>
Comments
Post a Comment