В Rails показать вложенные ресурсы не работает - PullRequest
0 голосов
/ 10 июля 2019

Я использую вложенные ресурсы.Когда я нажимаю на цель, которая была создана, я получаю эту ошибку:

param is missing or the value is empty: goal

И она направляет меня к строке "params.require ...":

    private
        def goal_params
            params.require(:goal).permit(:text)
        end

Я не уверен, что вызывает это.Я могу создать и показать список.Но когда я нажимаю на цель, я получаю эту ошибку.Я новичок в рельсах, и я в своем уме.

Мой взгляд:

<h1>Listing goals</h1>

<table>
  <tr>
    <th>Text</th>
    <th></th>
  </tr>

  <% @user.goals.each do |goal| %>
    <tr>
      <td><%= link_to goal.text, user_goals_path(@user, @goal)%></td>
    </tr>
  <% end %>
</table>


<h2>Add a comment:</h2>
<%= form_for([@user, @user.goals.build]) do |form| %>
  <p>
    <%= form.text_area :text %>
  </p>
  <p>
    <%= form.submit %>
  </p>
<% end %>

Мой контроллер:

class GoalsController < ApplicationController

    def index
        @user = User.find(params[:user_id])
        @goal = @user.goals.find(goal_params)
    end

    def show
        @user = User.find(params[:user_id])
        @goal = @user.goals.find(:id) 
        #also tried goal_params and :goal_id instead of :id
    end

    def new
        @user = User.find(params[:user_id])
        @goal = @user.goals.new
    end


    def create 
        @user = User.find(params[:user_id])
        @goal = @user.goals.build(goal_params)
        @goal.user = current_user

        if @goal.save
            redirect_to new_user_goal_path, notice: "Success!~"
        else 
            redirect_to new_user_goal_path, alert: "Failure!"
        end
        #to root_path
    end 

    private
        def goal_params
            params.require(:goal).permit(:text)
        end
end

Мои маршруты:

Rails.application.routes.draw do
  devise_for :users

  resources :user do
    resources :goals
  end

  devise_scope :user do
    authenticated :user do
      root 'home#index', as: :authenticated_root
    end



    unauthenticated do
      root 'devise/sessions#new', as: :unauthenticated_root
    end
  end

end

Мой show.html.erb:

<p>
  <strong>Text:</strong>
  <%= @goal.text %>
</p>

1 Ответ

0 голосов
/ 11 июля 2019

Во-первых, в шоу

@goal = @user.goals.find(:id) 

Должно быть

@goal = @user.goals.find(params[:id]) 

Вы сказали, что пытались с @user.goals.find(goal_params) в show действии, и я вижу это также в вашем index действии. Это вызовет метод goal_params, для которого требуется params[:goal], в то время как ваш запрос index или show не отправляется на сервер, только когда вы отправите форму, у вас будут эти параметры. Это причина вашей ошибки.

Во-вторых, ваш index должен использовать

@goals = @user.goals

ВМЕСТО

@goal = @user.goals.find(goal_params)

Кроме того, strong parameters используется только для действий create и update, чтобы избежать массового присвоения нашей базе данных. Он не используется для find записи.

...