我希望能够有一个链接,按下时根据控制器动作更新一个属性。我怎么能这样做?我是否必须创建单独的更新路由?我是新来的,所以请耐心等待。
控制器
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
答案 0 :(得分:8)
您的代码有几个问题
由于您要更新记录,因此需要在链接中包含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 %>
由于您的链接中有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
现在您需要做的就是在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