2015-03-23 3 views
1

Я пытаюсь создать простую форму представления для создания сообщений для сайта типа блога. Я не могу представить форму для отправки параметров. Если я удалю валидации в модели, я могу создавать объекты с уникальными идентификаторами, но они полностью пусты, насколько позволяют параметры.Форма создает объект, но параметры не передаются в

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 
+1

Вы используете Rails 4? Если да, то убедитесь, что вы правильно используете Сильные параметры в вашем контроллере, чтобы разрешить/потребовать определенные поля (https://github.com/rails/strong_parameters) (см. Действие 'create':' Post.new (post_params) 'здесь 'post_params' должен возвращать хэш, содержащие допустимые атрибуты) – MrYoshiji

+0

@MrYoshiji Я посмотрел в сильные параметры и добавил следующий код: \t' личного \t защиту post_params \t \t params.require (: пост) .permit (: название,: content_md) \t end' Теперь параметры передаются и объект создается правильно. Однако к объектам нельзя получить доступ. Он возвращает ошибку: «Не удалось найти сообщение с« id »= 123« Где он думает, что заголовок является идентификатором. Почему метод show передается заголовок вместо идентификатора? – JCDJulian

+0

Сразу после отправки формы для создания новой записи записи вы перенаправляетесь на страницу показа, которая вызывает ошибку «не удалось найти сообщение с id = X», так ли это? – MrYoshiji

ответ

1

Проблема здесь в том, что вы не определяют post_params, как вы должны делать (при использовании Rails 4 или используя StrongParameters камень):

# posts_controller 
def post_params 
    params.require(:post).permit([:list_of_allowed_attributes_here]) 
end 

Я вижу, вы используете FriendlyId. Для того, чтобы найти обратно запись с его дружественным ID, вы должны найти его, как это:

@post = Post.friendly.find(params[:id]) 

Поскольку params[:id] не является числом, как Rails ожидает, но FriendlyId (строка, содержащая ключевые слова и прочее).

Смежные вопросы