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

Popular posts from this blog

django - (fields.E300) Field defines a relation with model 'AbstractEmailUser' which is either not installed, or is abstract -

matlab - error with cyclic autocorrelation function -

php - Using grpc in Laravel, "Class 'Grpc\ChannelCredentials' not found." -