简体   繁体   English

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

[英]Rails link_to update attribute from controller action

I want to be able to have a link that when pressed updates one attribute based up a controller action. 我希望能够有一个链接按下时根据控制器动作更新一个属性。 How would I be able to do this? 我怎么能这样做? Do I have to create a separate update route? 我是否必须创建单独的更新路由? I am new at this so please bear with me. 我是新来的,所以请耐心等待。

controller 调节器

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

model 模型

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

view 视图

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

routes 路线

resources :meetings do
  get 'meetings/completed'
end

There are several issues with your code 您的代码有几个问题

  1. Since you are updating a record you need to include method: :patch in your link and also you need to modify the routes file to include appropriate route. 由于您要更新记录,因此需要在链接中包含method: :patch ,并且还需要修改routes文件以包含适当的路由。

    In your routes file add 在您的路线文件中添加

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

    In your view 在你看来

     <%= link_to "Mark as completed", completed_meeting_path(@meeting), remote: true, method: :patch %> 
  2. Since you have a remote:true in your link so rails will try to render a javascript template and since you are not rendering a javascript template you will get a template missing error 由于你的链接中有一个remote:true所以rails会尝试渲染一个javascript模板,因为你没有渲染一个javascript模板,你会得到一个模板缺失错误

    In your controller 在你的控制器中

     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 

Now all you need to do is to write some basic javascript in the js templates to update the view. 现在您需要做的就是在js模板中编写一些基本的javascript来更新视图。

Note : If you don't want to render anything simply use format.js { render :nothing => true } . 注意:如果您不想渲染任何内容,只需使用format.js { render :nothing => true } Also if you want to use redirect_to calls instead of rendering js template just remove remote: true form you link . 此外,如果您想使用redirect_to调用而不是渲染js模板,只需删除您链接的remote: true表单。

You can set the action in set_member_album =: image_capa 您可以在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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM