没有视图的Rails控制器操作

Cry*_*eão 9 ruby-on-rails rails-routing

我只是想做一个没有视图的rails操作.

在我的'routes.rb'中

resources :pictures do
    member do 
        post 'dislike'  
    end  
end
Run Code Online (Sandbox Code Playgroud)

在我的'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
Run Code Online (Sandbox Code Playgroud)

都不这样做

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
Run Code Online (Sandbox Code Playgroud)

甚至这个(但对我来说情况并非如此,我希望通过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
Run Code Online (Sandbox Code Playgroud)

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

ActionView::MissingTemplate: Missing template pictures/dislike, application/like with {:locale=>[:en], :formats=>[:html], :handlers=>[:erb, :builder, :coffee]}.
Run Code Online (Sandbox Code Playgroud)

我应该怎么告诉rails在PicturesController中这个动作不需要视图?

解决了!

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

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

小智 26

像这样的东西?

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
Run Code Online (Sandbox Code Playgroud)

  • `:nothing`将在rails 5.1中弃用,而不是`head` (2认同)

Cry*_*eão 5

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

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
Run Code Online (Sandbox Code Playgroud)

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

match 'pictures/:id/dislike' => "likes#dislike", :via => :post
Run Code Online (Sandbox Code Playgroud)

而我现在不喜欢的链接是

<%= link_to 'Dislike!', {:action => :dislike, :controller => :likes}, :method => :post %>
Run Code Online (Sandbox Code Playgroud)