I have a Result that belongs to a Website. After I create the website I also create the result and redirect to its edit page. Here I want to add some more values.
My problem is: When I try to update my Result, then I get:
param is missing or the value is empty: result       Request      Parameters:      {"utf8"=>"✓",  "_method"=>"patch",  "authenticity_token"=>"GRN/y/04Qbsm9DzlUAbUYF8ZSv2EMHnRZgBZY/6GMDlOBdq8V5Uncij9VRp51uydC6M/qc61jPWwpUehSuc5xA==", "data"=>["//html/body/div[position() = 3]/ul/li[position() = 16]/ul/li[position() = 2]/child::text()",  "//html/body/div[position()     = 3]/ul/li[position() = 16]/ul/li[position() = 2]/p/a/child::text()",  "//html/body/div[position() = 3]/ul/li[position() = 16]/ul/li[position() = 4]/child::text()",  "//html/body/div[position()     = 3]/ul/li[position() = 16]/ul/li[position() = 5]/a/child::text()"],  "commit"=>"Update Result",  "id"=>"66"}   This is how my Result params looks like
def result_params       params.require(:result).permit(:data)     end   My model:
class Result < ActiveRecord::Base   belongs_to :website   attr_accessor :website_id   attr_accessor :data    serialize :data, Array end   Here is my controller code:
    class ResultsController < ApplicationController   before_action :set_result, only: [:show, :edit, :update, :destroy]    # GET /Results   # GET /Results.json   def index     @results = Result.all   end    # GET /Results/1   # GET /Results/1.json   def show   end    # GET /Results/new   def new     @result = Result.new   end    # GET /Results/1/edit   def edit     @result = Result.find(params[:id])   end    # POST /Results   # POST /Results.json   def create     @result = Result.new(result_params)      respond_to do |format|       if @result.save         format.html { redirect_to @result, notice: 'Result was successfully created.' }         format.json { render :show, status: :created, location: result }       else         format.html { render :new }         format.json { render json: @result.errors, status: :unprocessable_entity }       end     end   end    # PATCH/PUT /Results/1   # PATCH/PUT /Results/1.json   def update     respond_to do |format|       if @result.update(result_params )         format.html { redirect_to @result, notice: 'Result was successfully updated.' }         format.json { render :show, status: :ok, location: @result }       else         format.html { render :edit }         format.json { render json: @result.errors, status: :unprocessable_entity }       end     end   end    # DELETE /Results/1   # DELETE /Results/1.json   def destroy     @result.destroy     respond_to do |format|       format.html { redirect_to results_url, notice: 'Result was successfully destroyed.' }       format.json { head :no_content }     end   end     private     # Use callbacks to share common setup or constraints between actions.     def set_result       @result = Result.find(params[:id])     end      # Never trust parameters from the scary internet, only allow the white list through.     def result_params       params.permit(:data => [])     end end   My view:
<%= form_for(@result) do |f| %>   <% if @result.errors.any? %>     <div id="error_explanation">       <h2><%= pluralize(@result.errors.count, "error") %> prohibited this result from being saved:</h2>        <ul>       <% @result.errors.full_messages.each do |message| %>         <li><%= message %></li>       <% end %>       </ul>     </div>   <% end %>       <div class="field">       <% if @result.website.url != nil %>       <%= atts = get_all_elements(@result.website.url)%>           <% atts.each do |p| %>               <div>                 <%= check_box_tag "data[]", get_xpath_from_node(p)%>                 <%= p.text %>               </div>           <%end%>       <% end%>     </div>    <div class="actions">     <%= f.submit %>   </div> <% end %>   And this is the place where i call the edit result page:
def update     respond_to do |format|       if @website.update(website_params)         format.html { redirect_to @website, notice: 'Website was successfully updated.' }         format.json { render :show, status: :ok, location: @website }       else         format.html { render :edit }         format.json { render json: @website.errors, status: :unprocessable_entity }       end     end   end   Ive allready tryed every solution I could find, but none of them seemed to work for me.
The missing function is used to check the status of the function arguments. It returns a boolean vector that has one element for each argument. If an element of the vector has the value T, it indicates that the corresponding argument is missing and, as a result, is filled in by a default value.
As you might have guessed, params is an alias for the parameters method. params comes from ActionController::Base, which is accessed by your application via ApplicationController. Specifically, params refers to the parameters being passed to the controller via a GET or POST request.
The problem lies here:
params.require(:result).permit(:data)   From require documentation,
require ensures that a parameter is present. If it's present, returns the parameter at the given key, otherwise raises an ActionController::ParameterMissing error.
You are requiring result parameter but it's missing from the params. All your values are inside data param. Removing require should do the trick.
params.permit(:data)   If you want to keep require, wrap data inside result in forms.
I know, what you met. if you strong params is
def result_params   params.require(:result).permit(:data) end   Your parameters should has the format like this
Parameters: {"result"=>{"data"=>"string"}}   and your parameters is just
Parameters: {"data"=>"string"}   so you should remove the "result"
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