Rails link_to从控制器操作更新属性

时间:2014-06-18 01:23:10

标签: ruby-on-rails controller update-attributes

我希望能够有一个链接,按下时根据控制器动作更新一个属性。我怎么能这样做?我是否必须创建单独的更新路由?我是新来的,所以请耐心等待。

控制器

def completed
 @meeting = Meeting.find(params[:id])
 if @meeting.day_of_meeting == @meeting.days
  @meeting.update_attribute(:day_of_meeting, '1')
  redirect_to :back
 else
  @meeting.increment!
  redirect_to :back
 end
end

模型

def increment!
  update_attribute(:day_of_meeting, day_of_meeting + 1)
end

视图

<%= link_to meetings_completed_path(@meeting), remote: true do %>

路由

resources :meetings do
  get 'meetings/completed'
end

2 个答案:

答案 0 :(得分:8)

您的代码有几个问题

  1. 由于您要更新记录,因此需要在链接中包含method: :patch,并且还需要修改路径文件以包含适当的路径。

    在路线文件中添加

    #routes.rb
    resources :meetings do
      member do
        patch 'completed'
      end
    end
    

    在你看来

    <%= link_to "Mark as completed", completed_meeting_path(@meeting), remote: true, method: :patch  %>
    
  2. 由于您的链接中有remote:true,因此rails会尝试呈现javascript模板,因为您没有呈现javascript模板,所以会出现模板丢失错误

    在您的控制器中

    def completed
      @meeting = Meeting.find(params[:id])
      respond_to do |format|
        # if something ...
          # update meeting record and then render js template
          format.js {render :status => :ok} # it will render completed.js.erb inside 'app/views/meetings/' directory
        # else
          # something else
          format.js {render :action => "different_action"} # it will render different_action.js.erb inside 'app/views/meetings/' directory 
      end
    end 
    
  3. 现在您需要做的就是在js模板中编写一些基本的javascript来更新视图。

    注意:如果您不想渲染任何内容,只需使用format.js { render :nothing => true }即可。 此外,如果您想使用redirect_to调用而不是渲染js模板,请删除您链接的remote: true表单。

答案 1 :(得分:0)

您可以在set_member_album =:image_capa

中设置操作
#app/controllers/member/albums_controller.rb
class Member::AlbumsController < ApplicationController
before_action :set_member_album, only: [:show, :edit, :update, :destroy, :image_capa]

  #PATCH/PUT /adm/image_capa/1
  def image_capa
    # @member_album = Member::Album.find(params[:id]) # sempre colocar a action before_action :set_member_album, only: [:show, :edit, :update, :destroy, :image_capa]
    if @member_album.update(image_capa: params[:image_capa])
      respond_to do |format|
        format.html { redirect_to member_albums_url, notice: t('albums.image_capa_success') }
        format.json { head :no_content }
      end
    end
  end

private
    # Use callbacks to share common setup or constraints between actions.
    def set_member_album
      @member_album = Member::Album.find(params[:id])
    end

end
相关问题