【问题标题】:Rails controller action without a view没有视图的 Rails 控制器操作
【发布时间】:2012-10-06 20:15:26
【问题描述】:

我只想做一个没有视图的 rails 动作。

在我的 'routes.rb'

resources :pictures do
    member do 
        post 'dislike'  
    end  
end

在我的 'PictureController.rb'
这不起作用

def dislike
    @picture = Picture.find(params[:id])
    @like = Like.find(:user_id => current_user.id, :picture_id => params[:id])

    @like.destroy

    respond_to do |format|
        format.html { render :action => :show, :id => params[:id], notice: 'You don\'t  like this picture anymore.' }
        format.json { render json: @picture }
    end
end

也不做

def dislike
    @picture = Picture.find(params[:id])
    @like = Like.find(:user_id => current_user.id, :picture_id => params[:id])

    @like.destroy

    respond_to do |format|
        format.html { redirect_to @picture, notice: 'You don\'t  like this picture anymore.' }
        format.json { render json: @picture }
    end
end

甚至这个(但对我来说不是这种情况,我希望通过 json 和 html 向用户提供反馈)

def dislike
    @picture = Picture.find(params[:id])
    @like = Like.find(:user_id => current_user.id, :picture_id => params[:id])

    @like.destroy

    render :nothing => true
end

但我不断收到此错误消息:

ActionView::MissingTemplate: Missing template pictures/dislike, application/like with {:locale=>[:en], :formats=>[:html], :handlers=>[:erb, :builder, :coffee]}.

我应该如何告诉 rails PicturesController 中的这个动作不需要视图?

解决了!

我并没有真正解决告诉 rails 我不需要视图的问题,我只是创建了另一个控制器,将方法放入其中,并告诉 rails 路由将不喜欢操作与match 调用匹配。 我不能确定,但​​我认为这是我的routes.rb 文件中的resources :picture 的问题...

但无论如何,谢谢你们! =)

【问题讨论】:

  • 致电render :nothing => true
  • 我假设您实际上并不想渲染 :nothing ,对吧?您是在尝试渲染 json 还是显示页面?
  • 是的,我想渲染一些东西,虽然render :nothing => true 也不起作用 =(
  • 为什么在dislike 操作中要求pictures/like 模板?我开始认为我们对究竟在什么情况下会发生错误感到非常困惑。
  • 刚刚编辑了问题,我粘贴了错误的错误=x

标签: ruby-on-rails rails-routing


【解决方案1】:

这样的?

def dislike
    @picture = Picture.find(params[:id]
    @like = Like.find(:user_id => current_user.id, :picture_id => params[:id])

    @like.destroy

    render :nothing => true
end

【讨论】:

  • :nothing 将在 Rails 5.1 中弃用,取而代之的是 head
【解决方案2】:

问题很可能是您通过 ajax 请求执行此操作。因此控制器正在寻找format.js,但您尚未在块中指定该格式的响应。因此,它已成为默认值。

试试

format.js { render json: @picture }

您可能还需要告诉 ajax 请求期待 json 响应。

【讨论】:

  • 实际上它在通过浏览器的 HTML 和测试用例中都失败了
  • 我假设你的意思是你在浏览器栏中输入路径来测试 html 渲染?在这种情况下,您应该会遇到路由错误 - 您定义了 post 路由,而不是 get
  • 不,我已经使用<%= link_to 'Like!', {:action => :like}, :method => :post %> 放置了指向该操作的链接,我得到的错误是问题中描述的错误...
  • @CrystianLeão 我认为生成pictures/like 而不是pictures/1/like,对吗? (1 可以是任何 ID)
  • @varatis 不,链接是正确的,它指向/pictures/980190963/like(当链接在图片/980190963时)
【解决方案3】:

刚刚创建了另一个具有不喜欢操作的控制器:

def dislike
    @picture = Picture.find(params[:id])
    @like = Like.find(:user_id => current_user.id, :picture_id => params[:id])

    @like.destroy

    respond_to do |format|
        format.html { redirect_to :back, notice: 'You don\'t  like this picture anymore.' }
        format.json { render json: @picture }
    end
end

并修改了我的 routes.rb 以匹配此操作:

match 'pictures/:id/dislike' => "likes#dislike", :via => :post

我现在不喜欢的链接是

<%= link_to 'Dislike!', {:action => :dislike, :controller => :likes}, :method => :post %>

【讨论】:

    猜你喜欢
    • 2015-11-23
    • 2016-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    相关资源
    最近更新 更多