Я пытаюсь создать простую форму представления для создания сообщений для сайта типа блога. Я не могу представить форму для отправки параметров. Если я удалю валидации в модели, я могу создавать объекты с уникальными идентификаторами, но они полностью пусты, насколько позволяют параметры.Форма создает объект, но параметры не передаются в
posts_controller.rb
class PostsController < ApplicationController
def index
@posts = Post.all
end
def show
@post = Post.find(params[:id])
end
def new
@post = Post.new
end
def create
@post = Post.new(post_params)
if @post.save
redirect_to post_path(@post), :notice => "Post was created successfully."
else
render :new
end
end
private
def post_params
params.require(:post).permit(:id)
end
new.html.erb
<%= form_for(@post) do |f| %>
<% if @post.errors.any? %>
<div id="error_explanation">
<ul>
<% @post.errors.full_messages.each do |msg| %>
<div><%= msg %></div>
<% end %>
</ul>
</div>
<% end %>
<% end %>
<%= form_for(@post) do |f| %>
<ol class="formdivst">
<%= f.label :title %><br />
<%= f.text_field :title %>
<%= f.label :content_md %><br />
<%= f.text_field :content_md %>
<div>
<%= f.file_field :image %>
<div class="actions">
<%= f.submit "Submit" %>
</div>
</ol>
<% end %>
posts.rb (модель)
class Post < ActiveRecord::Base
# Use friendly_id
extend FriendlyId
friendly_id :title, use: :slugged
# Markdown
#before_save { MarkdownWriter.update_html(self) }
# Validations
validates :title, presence: true, length: { maximum: 100 }, uniqueness: true
validates :content_md, presence: true
# Pagination
paginates_per 30
# Relations
belongs_to :user
# Scopes
scope :published, lambda {
where(draft: false)
.order("updated_at DESC")
}
scope :drafted, lambda {
where(draft: true)
.order("updated_at DESC")
}
has_attached_file :image, styles: { small: "64x64", med: "100x100", large: "200x200" }
end
routes.rb
app::Application.routes.draw do
root "pages#home"
resources :posts
get "home", to: "pages#home", as: "home"
get "inside", to: "pages#inside", as: "inside"
get "/contact", to: "pages#contact", as: "contact"
post "/emailconfirmation", to: "pages#email", as: "email_confirmation"
devise_for :users
namespace :admin do
resources :posts
root "base#index"
resources :users
get "posts/drafts", to: "posts#drafts", as: "posts_drafts"
get "posts/dashboard", to: "posts#dashboard", as: "posts_dashboard"
end
end
Вы используете Rails 4? Если да, то убедитесь, что вы правильно используете Сильные параметры в вашем контроллере, чтобы разрешить/потребовать определенные поля (https://github.com/rails/strong_parameters) (см. Действие 'create':' Post.new (post_params) 'здесь 'post_params' должен возвращать хэш, содержащие допустимые атрибуты) – MrYoshiji
@MrYoshiji Я посмотрел в сильные параметры и добавил следующий код: \t' личного \t защиту post_params \t \t params.require (: пост) .permit (: название,: content_md) \t end' Теперь параметры передаются и объект создается правильно. Однако к объектам нельзя получить доступ. Он возвращает ошибку: «Не удалось найти сообщение с« id »= 123« Где он думает, что заголовок является идентификатором. Почему метод show передается заголовок вместо идентификатора? – JCDJulian
Сразу после отправки формы для создания новой записи записи вы перенаправляетесь на страницу показа, которая вызывает ошибку «не удалось найти сообщение с id = X», так ли это? – MrYoshiji