Как правильно передать params объекту с помощью form_for? - PullRequest
0 голосов
/ 19 марта 2020

Я пытаюсь сделать Api, который передает заполненные символы формы, новые. html .erb, объекту в другом представлении, используя form_for и params [], show. html .erb, который показывает сообщение с заполненной формой, но я не могу найти правильный путь или лучший способ сделать это, что-то идет не так, когда я пытаюсь передать параметры другому представлению

views / рецепты / новые. html .erb

 <%= form_for :recipe, url: recipes_show_path do |r| %>
 Título: <%= r.text_field :title%><br />
 Tipo da Receita: <%= r.text_field :recipe_type%><br />
 Cozinha: <%= r.text_field :cuisine %><br />
 Dificuldade: <%= r.text_field :dificulty %><br />
 Tempo de Preparo: <%= r.text_field :cook_time_min %><br />
 Ingredientes: <%= r.text_field :ingredients %><br />
 Como Preparar: <%= r.text_field :cook_method %><br />
 Enviar: <%= r.submit %>
 <% end %>

просмотров / рецептов / шоу. html .erb

<h3>Detalhes</h3>
<p><%= @recipe.recipe_type %></p>
<p><%= @recipe.cuisine %></p>
<p><%= @recipe.difficulty %></p>
<p><%= @recipe.cook_time_min %></p>
<h3>Ingredientes</h3>
<p><%= @recipe.ingredients %></p>
<h3>Como Preparar</h3>
<p><%= @recipe.cook_method %></p>

<%= link_to 'Voltar', root_path %>

recipes_controller.rb

 class RecipesController < ApplicationController
  def index
    @recipes = Recipe.all
  end
  def new
  recipe = Recipe.new
  recipe.title = [:title]
  recipe.recipe_type = [:recipe_type]
  recipe.cuisine = [:cuisine]
  recipe.difficulty = [:difficult]
  recipe.cook_time_min = [:cook_time_min]
  recipe.ingredients = [:ingredients]
  recipe.cook_method = [:cook_method]
  recipe.save

  redirect recipes/show
  end
  def show
    @recipe = Recipe.find(params[:id])
  end
end

rout.rb

Rails.application.routes.draw do

  get 'recipes/show'
  get 'recipes/new'
  root to: 'recipes#index'
  resources :recipes
end

Ответы [ 2 ]

2 голосов
/ 19 марта 2020

Не используйте символы с form_for. Эта функция неоднократно помечалась для амортизации и не рекомендуется, вместо этого передайте фактическую переменную.

<%= form_for(@recipe) do |f| %>
   # ...
<% end %>

Избегайте явного добавления URL-адреса в форму - если вы используете соглашение по конфигурации, вы можете использовать эту же форму для действие редактирования / обновления.

Если вы действительно хотите сохранить объект в базе данных, вы должны настроить его следующим образом:

# config/routes.rb
resources :recipies, only: [:new, :create, :show]
# get rid of that other junk
class RecipesController < ApplicationController
  # GET /recipies/:id
  def show
    @recipe = Recipe.find(params[:id])
  end

  # GET /recipies
  def index
    @recipes = Recipe.all
  end

  # this action just displays a form
  # GET /recipies/new
  def new
    @recipe = Recipe.new
  end

  # this action handles the form submission and saves the record in the db
  # POST /recipies
  def create
    @recipe = Recipe.new(recipe_params)
    # don't just assume the input is valid!
    if @recipe.save
      redirect_to @recipe # redirects to recipes/:id
    else
      render :new # just renders the view - does not redirect 
    end
  end

  private 
  # this method whitelists the parameters we want to assign
  # if you are copying a hash key by key you're doing it wrong
  def recipe_params
    params.require(:recipe).permit(
     :title, :recipe_type, :cuisine, :difficult, 
     :cook_time_min, :ingredients, :cook_method
    )
  end
end

Что вы хотите сделать это действительно странно. Если вы действительно хотите передать объект без перенаправлений через перенаправление, вам нужно будет поместить все параметры в строку запроса:

# recipes/show?recipe[title]="Foo"&recipe[recipe_type]="Bar"...
redirect_to(recipe_path(recipe: recipe.attributes))

, а затем снова извлечь все параметры на другом конце:

@recipe = Recipe.new(recipe_params)

Вот почему вы выполняете рендеринг вместо перенаправления, когда запись недействительна. И когда вы перенаправляете на новую запись, вы просто используете идентификатор записи вместо того, чтобы пытаться передать все атрибуты.

1 голос
/ 19 марта 2020

Вот что вам нужно сделать

Сначала настройте new метод

def new
  @recipe = Recipe.new
end

Теперь создайте create метод для сохранения данных.

def create
  recipe = Recipe.new <-- I think you will need this with this set up
  recipe.title = params[:recipe][:title]
  recipe.recipe_type = params[:recipe][:recipe_type]
  recipe.cuisine = params[:recipe][:cuisine]
  recipe.difficulty = params[:recipe][:difficult]
  recipe.cook_time_min = params[:recipe][:cook_time_min]
  recipe.ingredients = params[:recipe][:ingredients]
  recipe.cook_method = params[:recipe][:cook_method]
  if recipe.save
    redirect_to recipe
  else
    # Probably some error handling?
  end
end

Измените, куда отправляется форма (переменная должна соответствовать тому, что установлено в методе new, поэтому она отправляется в метод create, сохраняет данные и затем перенаправляет в метод show.

<%= form_for(@recipe) do |r| %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...