Не используйте символы с 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)
Вот почему вы выполняете рендеринг вместо перенаправления, когда запись недействительна. И когда вы перенаправляете на новую запись, вы просто используете идентификатор записи вместо того, чтобы пытаться передать все атрибуты.