Rails 4 - 路径 - 更新操作

时间:2016-01-09 08:16:12

标签: ruby-on-rails path

我正在尝试在Rails 4中创建一个应用程序。

我有一篇文章模型。

显示页面包含一个按钮,该按钮应该是编辑(更新)方法的链接。

我有:

 <%= button_to 'Edit', articles_path(article), :method => :update, :class => 'btn btn-large btn-primary' %>

当我尝试这个时,我收到了这个错误:

文章中的NameError#show 显示//app/views/articles/show.html.erb第49行:

未定义的局部变量或方法`article'for#&lt;#:0x007fe14dc83030&gt;

第49行有要编辑的按钮。

有人能看出什么问题吗?

我的展示页面有:

<div class="col-xs-2">
            <%= image_tag @article.image.thumb.url if @article.image?  %>
        </div>
        <div class="col-xs-10">
            <div class="articletitle">
                <%= @article.title %>
            </div>    
            <div class="commentattributionname">
                <%= @article.user.try(:full_name) %>
            </div>
            <div class="commentattributiontitle">
                <%= @article.user.try(:formal_title) %>
            </div>
            <div class="commentattributiondate">
                <%= @article.created_at.try(:strftime, '%e %B %Y') %>
            </div>

        </div>
    </div>

    <div class="row">
        <div class="col-sm-9">
            <div class="intpol3" style="text-align: left; margin-left:60px; padding-top:50px">
               <%= safe_join(@article.body.split("\r\n"), "<br />".html_safe) %>
            </div>
        </div>  
        <div class="col-sm-3">
        <!-- placeholder for tags -->
        </div>  

    </div>

     <!-- if @article.user.full_name.present?  -->
       <!-- <div class="indexsubtext"> @article.user.full_name </div> -->
     <!-- end  -->
     <div class="row">
        <div class="col-xs-8">
        </div>
        <div class="col-xs-4">
            <div class="formminor" style="margin-bottom:5%">
                <% if policy(@article).update? %>
                 <%= button_to 'Edit', articles_path(article), :method => :update, :class => 'btn btn-large btn-primary' %>
                <% end %> 
                  |
                <%= link_to 'More from the blog', articles_path %>
            </div>
        </div>        
    </div>

我的文章控制器有:

class ArticlesController < ApplicationController
  before_action :set_article, only: [:show, :edit, :update, :destroy]
def set_article
      @article = Article.find(params[:id])
      authorize @article
    end

我的路线有:

resources :articles do
    collection do 
      get 'search' 
    end
    resources :comments, module: :articles
  end

如果我将其更改为:

<%= button_to 'Edit', articles_path(article), :method => :update, :class => 'btn btn-large btn-primary' %>

我收到此错误:

ActionController::ParameterMissing in ArticlesController#create
param is missing or the value is empty: article

我的控制器有:

def create
    # before_action :authenticate_user!
    # authorize @article
    @article = current_user.articles.new(article_params)

    respond_to do |format|
      if @article.save
        format.html { redirect_to(@article) }
        format.json { render :show, status: :created, location: @article }
      else
        format.html { render :new }
        format.json { render json: @article.errors, status: :unprocessable_entity }
      end
    end
  end

def article_params
      params.require(:article).permit(:body, :title, :image, :tag_list,
        comment_attributes: [:opinion])
    end

采取TAGLIA的建议

我收到此错误:

ActionController::ParameterMissing in ArticlesController#create
param is missing or the value is empty: article

2 个答案:

答案 0 :(得分:0)

这意味着您尚未在控制器中的任何位置定义Error:(124, 143) type mismatch; found: scala.collection.immutable.List[scala.collection.mutable.MutableList[String]] required: scala.collection.immutable.List[java.util.List[String]] 。您需要在文章展示操作中定义变量article或类似内容,这样您才能找到所需的文章。

答案 1 :(得分:0)

如果您使用resources :articles生成文章的路线,则rails会为您提供访问编辑操作的特定帮助程序。这应该有效:

 <%= button_to 'Edit', edit_article_path(@article), :class => 'btn btn-large btn-primary', method: :get %>

您的代码有两个问题:

  1. articles_path是一个帮助器,它生成索引操作的路径,不需要任何参数;
  2. “update”不是有效的HTTP动词:您只能使用GET,POST,PATCH,PUT和DELETE。更新操作的正确动词是PATCH(或PUT),仍然应该使用简单的GET来显示编辑表单,因为在该阶段没有模型更新。