2015-11-26 63 views
3

在Rails中创建一个博客,编辑功能会复制一篇文章,然后将更改保存到新记录中。我想编辑所以只需编辑原始帖子,不要做任何重复。想知道是否有人可以帮助我。Rails博客:编辑正在创建重复记录

下面是一些代码...只要让我知道,如果我需要张贴任何东西!

posts_controller.rb

class PostsController < ApplicationController 
    def index 
     @posts = Post.all.order('created_at DESC') 
    end 

def new 
    if user_signed_in? 
     @post = Post.new 
    else 
     redirect_to new_user_session_path 
    end 
end 

def create 
    @post = Post.new(post_params) 
    @post.save 
    redirect_to @post 
end 

def show 
    @post = Post.find(params[:id]) 
end 

def edit 
    if user_signed_in? 
     @post = Post.find(params[:id]) 
    else 
     redirect_to new_user_session_path 
    end 
end 

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

    if @post.update(params[:post].permit(:title, :category, :body)) 
     redirect_to @post 
    else 
     render 'edit' 
    end 
end 

def destroy 
    if user_signed_in? 
     @post = Post.find(params[:id]) 
     @post.destroy 
     redirect_to posts_path 
    else 
     redirect_to new_user_session_path 
    end 
end 

private 
    def post_params 
     params.require(:post).permit(:title, :category, :body) 
    end 
end 

_form.html.erb

<%= form_for :post, url: posts_path do |f| %> 
    <p> 
     <%= f.label :title %> 
     <%= f.text_field :title %> 
    </p> 
    <p> 
     <%= f.label :category %> 
     <%= f.select :category, ['x', 'y', 'z'] %> 
    </p> 
    <p> 
     <%= f.label :body %> 
     <%= f.text_area :body %> 
    </p> 
    <p class="actions"><%= link_to 'Back to Posts', posts_path %> | <%= f.submit %></p> 
<% end %> 

的routes.rb

Rails.application.routes.draw do 
    resources :posts, :lines 
    get 'home/index' 

    devise_for :users 

    root 'home#index' 

    devise_scope :user do 
    get "/admin" => "devise/sessions#new" 
    end 
end 
+0

你可以显示路线吗? –

+0

“:post”记录的表单在哪里?你为':line'发布了一个。 – Jason

+0

@SunnyK他们起来了! –

回答

2

您的形式被用POST行动内置因为form_for你的第一个参数是实例@post的象征,而不是:post。如果因为您希望为编辑视图和新视图使用这些字段而使表单部分中的表单应该放在部分字段中,但将form_for调用放在编辑视图和新视图中。在编辑看来,你应该使用

<%= form_for @post do |f| %> 

所以它建立在现有的记录,而不是一个新的记录形式。

+0

真棒,这固定它。谢谢。 –

0

你必须为新的和编辑的形式提供不同的form action paths

<%= form_for :line, url: lines_path do |f| %> 

错误是在url

如果按照惯例与resources :posts在你的路由文件中设置的路线,例如,比你可以删除从表单辅助方法url参数和Rails为您代劳。

如果你的路线不符合的REST约定。比你应该提供的url作为局部变量的部分。

您创建视图:

<%= render partial: 'form', locals: { url: path_to_create_action } %> 

您更新视图:

<%= render partial: 'form', locals: { url: path_to_update_action } %> 

而在你_form.html.erb:

<%= form_for :line, url: url do |f| %> 
    <!-- ... --> 
<% end %> 

您可以在Docs找到更多信息。